说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Project Tungsten:让Spark将硬件性能压榨到极限

HTML文档下载 WORD文档下载 PDF文档下载
对于Spark来说,通用只是其目标之一,更好的性能同样是其赖以生存的立足之本。北京时间4月28日晚,Databricks在其官方博客上发布了Tungsten项目,并简述了Spark性能提升下一阶段的RoadMap。

本文编译自Databricks Blog(Project Tungsten: Bringing Spark Closer to Bare Metal),作者Reynold Xin(@hashjoin)、Josh Rosen。由七牛云存储技术总监陈超(@CrazyJvm)友情审校。

以下为原文:

在之前的博文中,我们回顾和总结了2014年Spark在性能提升上所做的努力。本篇博文中,我们将为你介绍性能提升的下一阶段——Tungsten。在2014年,我们目睹了Spark缔造大规模排序的新世界纪录,同时也看到了Spark整个引擎的大幅度提升——从Python到SQL再到机器学习。

Tungsten项目将是Spark自诞生以来内核级别的最大改动,以大幅度提升Spark应用程序的内存和CPU利用率为目标,旨在最大程度上压榨新时代硬件性能。Project Tungsten包括了3个方面的努力:

  • Memory Management和Binary Processing:利用应用的语义(application semantics)来更明确地管理内存,同时消除JVM对象模型和垃圾回收开销。
  • Cache-aware computation(缓存友好的计算):使用算法和数据结构来实现内存分级结构(memory hierarchy)。
  • 代码生成(Code generation):使用代码生成来利用新型编译器和CPU。

之所以大幅度聚焦内存和CPU的利用,其主要原因就在于:对比IO和网络通信,Spark在CPU和内存上遭遇的瓶颈日益增多。详细信息可以查看最新的大数据负载性能研究(Ousterhout ),而我们在为Databricks Cloud用户做优化调整时也得出了类似的结论。

为什么CPU会成为新的瓶颈?这里存在多个问题:首先,在硬件配置中,IO带宽提升的非常明显,比如10Gbps网络和SSD存储(或者做了条文化处理的HDD阵列)提供的高带宽;从软件的角度来看,通过Spark优化器基于业务对输入数据进行剪枝,当下许多类型的工作负载已经不会再需要使用大量的IO;在Spark Shuffle子系统中,对比底层硬件系统提供的原始吞吐量,序列化和哈希(CPU相关)成为主要瓶颈。从种种迹象来看,对比IO,Spark当下更受限于CPU效率和内存压力。

1. Memory Management和Binary Processing

在JVM上的应用程序通常依赖JVM的垃圾回收机制来管理内存。毫无疑问,JVM绝对是一个伟大的工程,为不同工作负载提供了一个通用的运行环境。然而,随着Spark应用程序性能的不断提升,JVM对象和GC开销产生的影响将非常致命。

一直以来,Java对象产生的开销都非常大。在UTF-8编码上,简单如“abcd”这样的字符串也需要4个字节进行储存。然而,到了JVM情况就更糟糕了。为了更加通用,它重新定制了自己的储存机制——使用UTF-16方式编码每个字符(2字节),与此同时,每个String对象还包含一个12字节的header,和一个8字节的哈希编码,我们可以从 Java Object Layout工具的输出上获得一个更清晰的理解:

java.lang.String object internals:OFFSET  SIZE   TYPE DESCRIPTION                    VALUE     0     4        (object header)                ...     4     4        (object header)                ...     8     4        (object header)                ...    12     4 char[] String.value                   []    16     4    int String.hash                    0    20     4    int String.hash32                  0Instance size: 24 bytes (reported by Instrumentation API)
毫无疑问,在JVM对象模型中,一个4字节的字符串需要48字节的空间来存储!

JVM对象带来的另一个问题是GC。从高等级上看,通常情况下GC会将对象划分成两种类型:第一种会有很高的allocation/deallocation(年轻代),另一种的状态非常稳定(年老代)。通过利用年轻代对象的瞬时特性,垃圾收集器可以更有效率地对其进行管理。在GC可以可靠地估算对象的生命周期时,这种机制可以良好运行,但是如果只是基于一个很短的时间,这个机制很显然会遭遇困境,比如对象忽然从年轻代进入到年老代。鉴于这种实现基于一个启发和估计的原理,性能可以通过GC调优的一些“黑魔法”来实现,因此你可能需要给JVM更多的参数让其弄清楚对象的生命周期。

然而,Spark追求的不仅仅是通用性。在计算上,Spark了解每个步骤的数据传输,以及每个作业和任务的范围。因此,对比JVM垃圾收集器,Spark知悉内存块生命周期的更多信息,从而在内存管理上拥有比JVM更具效率的可能。

为了扭转对象开销和无效率GC产生的影响,我们引入了一个显式的内存管理器让Spark操作可以直接针对二进制数据而不是Java对象。它基于sun.misc.Unsafe建立,由JVM提供,一个类似C的内存访问功能(比如explicit allocation、deallocation和pointer arithmetics)。此外,Unsafe方法是内置的,这意味着,每个方法都将由JIT编译成单一的机器指令。

在某些方面,Spark已经开始利用内存管理。2014年,Databricks引入了一个新的基于Netty的网络传输机制,它使用一个类jemalloc的内存管理器来管理所有网络缓冲。这个机制让Spark shuffle得到了非常大的改善,也帮助了Spark创造了新的世界纪录。

新内存管理的首次亮相将出现在Spark 1.4版本,它包含了一个由Spark管理,可以直接在内存中操作二进制数据的hashmap。对比标准的Java HashMap,该实现避免了很多中间环节开销,并且对垃圾收集器透明。


当下,这个功能仍然处于开发阶段,但是其展现的初始测试行能已然令人兴奋。如上图所示,我们在3个不同的途径中对比了聚合计算的吞吐量——开发中的新模型、offheap模型、以及java.util.HashMap。新的hashmap可以支撑每秒超过100万的聚合操作,大约是java.util.HashMap的两倍。更重要的是,在没有太多参数调优的情况下,随着内存利用增加,这个模式基本上不存在性能的衰弱,而使用JVM默认模式最终已被GC压垮。

在Spark 1.4中,这个hashmap可以为DataFracmes和SQL的聚合处理使用,而在1.5中,我们将为其他操作提供一个让其利用这个特性的数据结构,比如sort和join。毫无疑问,它将应用到大量需要调优GC以获得高性能的场景。

2. Cache-aware computation(缓存友好的计算)

在解释Cache-aware computation之前,我们首先回顾一下“内存计算”,也是Spark广为业内知晓的优势。对于Spark来说,它可以更好地利用集群中的内存资源,提供了比基于磁盘解决方案更快的速度。然而,Spark同样可以处理超过内存大小的数据,自动地外溢到磁盘,并执行额外的操作,比如排序和哈希。

类似的情况,Cache-aware computation通过使用 L1/ L2/L3 CPU缓存来提升速度,同样也可以处理超过寄存器大小的数据。在给用户Spark应用程序做性能分析时,我们发现大量的CPU时间因为等待从内存中读取数据而浪费。在 Tungsten项目中,我们设计了更加缓存友好的算法和数据结构,从而让Spark应用程序可以花费更少的时间等待CPU从内存中读取数据,也给有用工作提供了更多的计算时间。

我们不妨看向对记录排序的例子。一个标准的排序步骤需要为记录储存一组的指针,并使用quicksort 来互换指针直到所有记录被排序。基于顺序扫描的特性,排序通常能获得一个不错的缓存命中率。然而,排序一组指针的缓存命中率却很低,因为每个比较运算都需要对两个指针解引用,而这两个指针对应的却是内存中两个随机位置的数据。


那么,我们该如何提高排序中的缓存本地性?其中一个方法就是通过指针顺序地储存每个记录的sort key。举个例子,如果sort key是一个64位的整型,那么我们需要在指针阵列中使用128位(64位指针,64位sort key)来储存每条记录。这个途径下,每个quicksort对比操作只需要线性的查找每对pointer-key,从而不会产生任何的随机扫描。希望上述解释可以让你对我们提高缓存本地性的方法有一定的了解。

这样一来,我们又如何将这些优化应用到Spark?大多数分布式数据处理都可以归结为多个操作组成的一个小列表,比如聚合、排序和join。因此,通过提升这些操作的效率,我们可以从整体上提升Spark。我们已经为排序操作建立了一个新的版本,它比老版本的速度快5倍。这个新的sort将会被应用到sort-based shuffle、high cardinality aggregations和sort-merge join operator。在2015年底,所有Spark上的低等级算法都将升级为cache-aware,从而让所有应用程序的效率都得到提高——从机器学习到SQL。

3. 代码生成

大约在1年前,Spark引入代码生成用于SQL和DataFrames里的表达式求值(expression evaluation)。表达式求值的过程是在特定的记录上计算一个表达式的值(比如age > 35 && age < 40)。当然,这里是在运行时,而不是在一个缓慢的解释器中为每个行做单步调试。对比解释器,代码生成去掉了原始数据类型的封装,更重要的是,避免了昂贵的多态函数调度。

在之前的博文中,我们阐述了代码生成可以加速(接近一个量级)多种TPC-DS查询。当下,我们正在努力让代码生成可以应用到所有的内置表达式上。此外,我们计划提升代码生成的等级,从每次一条记录表达式求值到向量化表达式求值,使用JIT来开发更好的作用于新型CPU的指令流水线,从而在同时处理多条记录。

在通过表达式求值优化内部组件的CPU效率之外,我们还期望将代码生成推到更广泛的地方,其中一个就是shuffle过程中将数据从内存二进制格式转换到wire-protocol。如之前所述,取代带宽,shuffle通常会因数据系列化出现瓶颈。通过代码生成,我们可以显著地提升序列化吞吐量,从而反过来作用到shuffle网络吞吐量的提升。


上面的图片对比了单线程对800万复杂行做shuffle的性能,分别使用的是Kryo和代码生成,在速度上后者是前者的2倍以上。

Tungsten和未来的工作

在未来的几个版本中,Tungsten将大幅度提升Spark的核心引擎。它首先将登陆Spark 1.4版本,包括了Dataframe API中聚合操作的内存管理,以及定制化序列化器。二进制内存管理的扩展和cache-aware数据结构将出现在Spark 1.5的部分项目(基于DataFrame模型)中。当然如果需要的话,这个提升也会应用到Spark RDD API。

对于Spark,Tungsten是一个长期的项目,因此也存在很多的可能性。值得关注的是,我们还将考察LLVM或者OpenCL,让Spark应用程序可以利用新型CPU所提供的SSE/SIMD指令,以及GPU更好的并行性来提升机器学习和图的计算。

Spark不变的目标就是提供一个单一的平台,让用户可以从中获得更好的分布式算法来匹配任何类型的数据处理任务。其中,性能一直是主要的目标之一,而Tungsten的目标就是让Spark应用程序达到硬件性能的极限。更多详情可以持续关注Databricks博客,以及6月旧金山的Spark Summit。

Meteor PK Django,谁更适合开发实时Web应用? 学编程就像选家具:去宜家还是从种树开始? 前车之鉴 十二个年度最差设计网站汇集 冷暖交替,2014年编程兴衰趋势预测 诺基亚出Android手机,微软或将受惠 苹果不收购Nest的大猜想 Netflix开源S3一致性提升利器S3mper Fi 《近匠》第06期:UCloud——目标!完整云服务 小三上位:Windows Phone不容忽视的契机 “详解Visual Studio 2013”全国巡讲北京站:无忧开发iOS及Android应用 Chrome最新版:快速静音及在Win8中建Chrome OS系统 雅虎COO Henrique de Castro因业绩不佳被解雇 分析比特币背后的数据算法,抢占背后巨大市场先机 美食菜谱将会成创业风口的两大理由 Windows XP杀毒软件更新 将被延至2015年7月 小心,商家已经盯上你了 一软一硬 让你时刻保持清醒的可穿戴产品 寓教于乐 贝瓦依托移动平台打造中国式儿童“轻教育” 中科创达:CES2014上的中国红 SA:2014年移动互联网十大技术创新预测 回顾2013:HBase的提升与挑战 Google打造云中Hadoop便捷版,强势对抗AWS 【信息图】专业Web设计师和业余设计师的发展状况并不协调 先试后买:Agawi推新型广告服务AppGlimpse 搜狗CEO王小川:“硬件免费”是误区 平均比Hive快24倍,Impala剑指Stinger 利用ElasticSearch和Redis检索和存储十亿信息 微软高管再度失血 媒体及娱乐副总裁因内部重组离职 Google研制智能隐形眼镜 帮助病人监测血糖指标 盘点2013:最优秀的HTML5&amp;CSS3设计【多图】 AMD:未来PC将同时搭载Android、Windows双系统 ?有没有啊 以下程序的输出值是 哪位朋友知晓如果Table与DbGrid绑定后,如何实现非第一索引的排序。 请问MSDN有中文版的吗?我们这的全是英文版的 我的 Win2000 出大问题了,急盼各位大虾赐教 请问那里有VB.NET软件下载呀 什么delphi命令可以打开网页呢? 到底有没有人知道如何可以在panel中动态的调用frame或者是form呢? 哪里有windowsXP下载? 送我能给的最大分,请教很小的问题,中高手进 聊天请进(thinkingdog) 大家来谈谈 IBM都有些什么认证???什么认证现在比较吃香???谢谢!!! 打印数窗问题求助! 如何使用UrlDownloadtoFile下载文件使用进度条? 如何用在两次用getTime()中得到两个不同的时间。 一个类似于牛角尖的问题(多余的CONST),不能忽视,请各位高手详细说明!!谢谢! 怎样读写注册表,每次都不成功,气死我也~! 各位救命啊,用 TClientDataSet.Load XML 的问题。。。。 娃呀呀,pb8怎么这么难安装?jaguar组建就用了5分钟,regester window又用了10分钟,重启动后,还没完,偶不敢装了,把碟退了出来,大家是不是也这样?//牛虻 请教高手一个ado的问题. 请问一个TWebBrowser的问题 请问:系统崩溃后,找不到BOOT,系统告诉:DOS基本分区为格式化?无法引导启动! 在VB.NET的tabcontrol上放置AxMSFlexGrid控件问题,急 java3D 现在大家是用Oracle 8还是 Oracle 9??? C++问题求助! 请教一个错误的原因. 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版 SCJP里的那些什么300-020,020是什么意思啊? 请问一个关于document.write()方法的问题。急啊! 初学者,欢迎灌水。 Delphi6的Bug?不兼容? 为什么我用GetProfileString()却总是得不到结果 sos 请教各位大侠一个问题 delphi6中的installShield 请介绍接收端CRC校验传输内容是否正确的方法,资料或代码。谢谢! 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁会做软件狗?有钱赚了!!! 为什么我用QuickRep作的报表只能显示一条记录,而且columnHeaderBand上内容也显示不出来 请问在税务局开发数据库的同行么?? 大家好各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁做过软件狗,马上来拿钱!!! 江苏省的成绩什么时候可以出来啊,我是徐州的 shockwaveflash没有hwnd,怎么办? chechy(chechy) 你在吗? 一个关于用excel做的日报的问题 谁会做软件狗,马上来拿钱!!! 给你下跪了,给你磕头了,给你鞠躬了。很简单的问题。谢谢 那位大哥能告诉我在VC中我要创建类的话应该做哪些工作步骤(要详细的,呵呵) 紧急求救,asp连接mysql问题 在使用twebbrowser的时候,怎样制止网页的自动刷新和跳转? 压力容器A/B/C/D分类具体是指什么意思?A与D有区别是什么? 不同季节正午太阳光下物体影子的长度有什么特点?为什么? l正午时我们在太阳底下的影子长度比下 午时我们在太阳底下的影子的长度 ( ) A. 要长 B. 不变 C. 要短 D, 一年的正午学校旗杆的影子在旗杆的什么方向为什么 【化学变化】牛奶和醋放在一起有什么变化?再喝下去呢? 射线b级检测,焊缝是否要磨平 某学校操场上,在O处立有一旗杆,OP是正午时旗杆在地上的影子,影子长度经常变化,当6月22日时影子缩短为0.M有棵树,OM与OP相垂直.(1)旗杆所处纬度为_______,因为____________________________,到________ 某地有一幢楼,楼房高度为h,太阳高度角为a,楼间距和正午的影子为S,回答4-5题.4.若在12月22日,正午影长与楼房高度相同,该地的纬度是:( )①23°26¢N ②21°34¢N ③25°26¢N ④68°26¢ 紫铜管钎焊焊缝能用射线检测吗 干冰在人工降雨时所发生的物态变化仔细一点应该好像有四种吧 延长记号是什么样子 “春天的花开,秋天的风以及冬天的落日”是哪首歌里的词 用干冰人工降雨发生了哪些物态变化? 右下图是中国节水标志,用简练的语言写一段解说文字,向同学和家人解说图案的构成要素、造型特点.右下图是中国节水标志,请仔细观察,用简练的语言写一段解说文字,向同学和家人解说图案 从一天当中阳光下的物体的影子的变化发现什么 请问这个焊接符号是代表什么意思?还有a 1.5 是什么意思 音乐中的休止符号是什么样子? 你的家在——,一天当中阳光下的物体的影子是怎样变化的?5年级《寒假之友》4页 急!早晨。上午。傍晚。中午的影子。 通过观察你发现了什么? 这个焊接符号代表什么意思? 俄罗斯东部西伯利亚地区的三大河流,自东向西依次是 二氧化碳气体保护焊能不能焊接压力容器 二氧化碳气体保护焊能不能焊接压力容器我是一名焊工,制造压力容器采用二氧化碳气体保护焊焊接A、B类焊缝成形可以,X光照射也可以,就是厂里没有 若北京天安门广场的旗杆影子最短,求北京时间 纸袋包装的牛奶和普通包装牛奶有什么区别 CO2焊为什么不能焊接压力容器 为什么牛奶滴进醋里会变成那样?你去试试? 关于旗杆影子的问题一天中,在早晨,中午,下午分别观察操场上的旗杆影子长度,有什么样的变化?为什么会有这样的变化?在一年中的不同季节,观察中午时刻的旗杆影子,又有什么不同?说出产生 牛奶塑料袋包装的和枕包(纸袋)的有什么区别吗?主要是在牛奶的质量上有区别吗? 西伯利亚地区有哪些民族,为什么苏联解体了,俄罗斯联邦还存在呢?为什么不把中国元朝时期就属于中国的领土:西伯利亚、外蒙古、 库页岛、唐努乌良海、新疆西北等地,归还中国统治呢? 太阳光和地面的夹角叫_________.一天中,旗杆影子的长度最短的时间是太阳在最高的位置———中午的时候,. 枕包装的牛奶和塑料袋包装的牛奶有什么区别?比较起来,枕装的比塑料袋装的贵在哪里? 久旱无雨时,人们就要实施人工增雨——在云层中撒些干冰,达到人工降水.试解释这么做的道理. 在天安门广场上的旗杆你知道哪一天影子最长哪天最短为什么 A,B,C,D级压力容器划分与一二三类压力容器的划分有什么区别 久旱无雨时,人们就要实施人工降雨——在云层中撒些干冰,达到人工降雨,能解释这么做的道理吗?干冰即(固体二氧化碳) 一年之中,旗杆的影子每天12点时一样长吗?什么时候最长 压力容器b类焊缝要百分之多少射线探伤 当把干冰撒在空中时,干冰进入云层,很快什么为气体. 为什么俄罗斯西伯利亚地区三大河流的下游几乎没有农田RT 压力容器筒体对接,平焊缝,纵焊缝,(A,B类焊缝)可以用二氧气保焊焊接? 在同一时间,同样高度的建筑物,在下列哪个城市中它的影子最长A.深圳B.宁波C.杭州D.北京 俄罗斯西伯利亚地区三大河流为何自南向北流? 仿写例句,续写句子.例:春天的雨,细腻而轻柔,给山野披上美丽的衣裳续写 秋天的雨冬天的雨谢, 在同一时间,同样高度的建筑物,在下列哪个城市中它的影子最长( )A.深圳 B.宁波 C.杭州 D.北京 俄罗斯西西伯利亚地区的三大河流(鄂毕河,叶尼塞河,勒拿河)为什么自南向北流? 仿照例句,再续写两个句子.春天的雨,细腻而轻柔,给山野披上美丽的衣裳;夏天的雷,迅疾而猛烈,为生命敲响热烈的战鼓;秋天的风,_________,________________;冬天的雪,_________,________________. 在同一时间,同样高度的建筑物,在下列哪个城市中的影子最长() A 深圳 B宁波 C杭州 D北京在同一时间,同样高度的建筑物,在下列哪个城市中的影子最长()A 深圳 B宁波 C杭州 D北京 干冰很容易发生哪种物态变化? 袋装牛奶如果放在杯子里加热水热一下,这样会因为塑料袋加热而产生什么毒素嘛? 科学选择题:在同一时间,同样高度的建筑物,在下列哪个城市中它的影子最长?A.深圳B.宁波C.杭州D.北京 为什么俄罗斯亚洲部分的三大河流中下游几乎没有农田 俄罗斯西伯利亚三大暖流自南向北流的原因是?还有两个问题:为啥每3、4月份,三四月份会出现河水泛滥,河流两岸形成大片沼泽地,这是河水不会全部注入北冰洋的原因是?、三条河流下游却没 在同一时间,同样高度的建筑物,深圳,宁波,杭州,北京哪个城市的影子最长 什么季节正午房屋影子最长?太阳斜射在?几次?什么季节正午房屋影子最短?斜射在?几次 中午12点时太阳底下人的影子()A最长 B最短 C不变 牛奶醋需要什么牛奶跟醋混合来喝对减肥比较好! 不同季节正午太阳高度下影子的长度 中午12点在太阳底下人的影子是( ).A最长 B最短 C不变 D无法确认 压力容器一、二、三类是怎么分类的 牛奶倒入醋为什么会发生变化 RT射线检测管道焊缝的防护问题咱是新手,刚来不到一个月.我看这里检测焊缝时候,人在10米外左右,射线头是放在架子上向下对着管子的,这样子不会射到人的么?为什么公司说的时候挺夸张的.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn