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

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。

【专访】敏捷专家吴穹:敏捷测试的行业应用与实战解析 英特尔中国研究院最新成果亮相 展示智能衣服瓷杯机器人等创新作品 Node.js 打造实时多人游戏框架 深圳微信开发者大会购票企业特征分析 上门汽车服务“e保养”完成A轮500万美元融资 Docker之父Solomon Hykes谈项目开发的初衷和挑战 浪潮是如何实现单日5000台x86服务器交付互联网的? Bootstrap 3.3.0发布 版本4不再支持IE8 漏洞预警:FTP曝严重远程执行漏洞 影响多个版本Unix 【简讯】W3C小组宣布HTML5标准制定完成 AMD发布GPUPerfAPI 2.14,GPU性能检测更Easy! 开放能力升级——微信公众号登陆授权开启公测! 百度最“智能”的新型推荐技术——智能因子分解机 消灭Bug!18款最佳的问题跟踪管理应用程序 Google Analytics为什么会这么快 【MDCC 2014】Xamarin深入体验营——开发实战大揭秘 【MDCC 2014】电信技术专场:运营商与开发者如何合作共赢 【MDCC 2014】高德LBS大赛闭幕式暨颁奖典礼:下一个50亿应用花落谁家? MDCC 2014移动开发者大会开幕:全生态系统齐聚 开发者成主角 蓝港互动有限公司董事长&amp;amp;首席执行官王峰:移动互联网泛娱乐化趋势 多盟联合创始人&amp;amp;总裁张鹤:多盟DSPAN助力开发者高效变现 创新工场联合创始人汪华:移动互联网时代的跃迁式增长 阿里巴巴集团UC移动事业群总裁俞永福:AMAP Inside——更专业、更开放 《程序员+》移动应用上线 启动“2014 MDCC十大人气应用/产品评选活动” 微软开发体验与平台合作事业部大中华区DX部门总经理Srikanth Raju:基于云的跨平台开发 Facebook平台工程合作部亚太区总经理张博:通过Facebook构建下一代移动应用 Vungle工程副总裁Wayne Chan:移动视频广告的未来 友盟副总裁焦岳:2014移动互联网行业趋势&amp;amp;大数据的行业价值与运营支持 联发科技创意实验室副总裁Marc Naddell:以小博大的可穿戴方案 用友软件股份有限公司高级副总裁谢志华:企业互联网移动化触手可及 【MDCC 2014】英雄会晚宴——厉兵秣马,再上征程 有关“隐藏”,“覆盖”的一些问题: 如何把A库中A表原样复制到B库中去? 怎样取得鼠标点击DataGrid控件时是哪一行,哪一列呢?(C#) ISA 2K发布多个WEB 服务器问题,(我都要疯了)高分求救 这个问题怎么办?? (ADO OPEN) Up 有分! 母亲生日,你觉得送什么礼物为好? 用c++ 写的 hello 程序在unix g++ 编译通过后,运行出错 如下几个初级问题要问,高手们请进-> SQLSERVER高手进来聊聊........ 怎样用代码实现两台电脑之间的文件传输? 哪位知道Microsoft Firewall Client 的下载地址? 关于RECORDset的问题,求教 如何在web页面使用 Windows 窗体控件,最好有例子! 使用DOM的XMLHttpRequest对象来发送xml请求,但当返回的响应带有中文时候,在PDA上无法正常显示,我使用MultiByteToWideChar也没用。有人 请问在窗口中放置控件时,PB是否有靠近格线对齐的功能。如果有,在哪设置? DELPHI中FASTNET组件使用方法 请问在SELECT查询中怎样娶得行号? 在一般的类中如何得到当前文档的指针? 巨菜问题:重装xp后grub启动菜单消失,怎么办? FIP上传问题,非常着急,在线等,解决就结贴, 用javaScript打开窗口后,原窗口的gif动画不动了 FindWindow的用法 反正没几个人能回答,发来玩玩。 在当前文档中如何实现刷新操作? 构造sql语句时,表名或字段有可能是sql的保留字段,如何解决? 小弟急需文件操作和线程管理方面方法技巧的资料,望各位英雄赐教 怎么将power point打包成exe 如何恢复execl中vba的密码 怎样在ISA中设置带宽限制? 如何实现数据库的更新?? 搜胡首页是<<美英百架战机空袭伊拉克 攻伊序幕已拉开>>,但... string 读取的问题。 正在看c++primer的请看(高手当然也能看拉) 有哪位高手用过bcp_exec导入数据吗? vb数据库安全问题 大学新生师弟师妹们很快要来报告了,大家能不能帮我想想一些迎新的宣传标语? 数据窗口中dddw下拉前触发的事件是哪一个(使用pbm_dwndropdown无效)? 有关的vs.net的简单问题! 下周可能要去勞動局!矛盾激化! 博士,硕士,教授等请进,关于前途的问题: 如果明天csdn也被封了,我们还能做什么???? 请问SQL SERVER区分大小写吗 关于lcc-win32 winme下如何调整显示器的刷新率 大家练练手,征集下面这个小程序的算法!!!(很有趣的阿!!) 消失的古代王朝---亚述 Web services 的应用。 关于EXCEL中,连接到其他文件的删除问题 30 分 大侠们,怎么打包BDE,在线等待,急 关于VB的报表打印问题 请教:如何判断Varient变量是否为空? 奥运五环为什么红色代表美洲,蓝色代表欧洲请看清楚问题. “我就是抄下来的”怎么翻译成英语 求缘是天意 份在人为的英文翻译! 减法运算的意义是什么? 英语翻译:缘分怎么说?有例子更好. 这是一种缘份!让我们祝他们生日快乐!英语翻译 有理数减法的定义 1.I'm going to go to Hainan(同义句转换) 2.Are you going to go swimming.(同义句转换) tomorrow we are going to go to Hainan .中的tomorrow应该在前还是在后,为什么? 关于中国历史上所签署的各个不平等条约的时间,地点,原因,以及影响在中国18世纪中后期到辛亥革命时签署的所有条约都对中国造成了很大的影响,那么他们的时间,地点,原因,影响分别是什么 高中地理人教版必修一考题.识图题.等压线分布图. 池塘里的莲池塘里的莲,托着荷叶的是_______,顶着荷花的是,莲真正的茎是横卧在污泥里的_________,藕内布满的细丝是______组织 有哪个兄弟知道,测量喷塑漆层附着力的工具是什么啊?以前见过,不知道叫什么名字,类似螺纹塞规的样子. 英语翻译刚开始进公司的时候,我协助经理组建销售部门,我的主要工作是收集市场信息,走访相关企业,了解市场供求信息,并写市场分析报告.之后我开始负责公司项目推广工作,主要是定期召开 广州话 距噶 一定量的Na2CO3和NaHCO3的混合物跟足量的盐酸反应,共耗酸0.8摩,生成CO20.5摩,求Na2CO3`NaHCO3的质量各多 ‘升’字的英文翻译? 广州话噶口语“几啦”是什么意思? 吸盘式挂钩只能挂在玻璃上的原因 铁元素在食品中生理功能 广州话噶口语“几啦”是什么意思! 为什么NaHCO3 ,Na2CO3与酸反应时,NaHCO3反应的更剧烈? 影响Fe吸收的主要因素有哪些? 英文短语“注意安全” 这幅图你能看到几个字?听说最多的能看到18个字. 这个用系统命名法怎么念?为什么不念做3,5-二甲基-5-乙基庚烷? 交通安全的英语短语不要闯红灯.... 求一张写着字的图片.上面写着一句话的就是张爱玲的那一句"明明不相干的,也会在心中拐好几个弯想到你"把图片贴出来或者把网址交出来~额.是手写的. 系统命名法问题2-二甲基戊烷对吗?是不是应该写成2,2-二甲基戊烷 I'm going to go to middle school this September.(变成一般疑问句)按要求完成句子 如果这幅图旁边要配上一句话或一个词,大家认为配什么好一些?最好是偏现代些的,不要太长,一句话或一个词,也可以是小说动漫电影各种各种的语录什么的,也可以是原创的,只要合适意境, 关于系统命名法的问题命名时-CH2C(CH3)3和-CH(CH3)CHCH3哪个在前面?前一个更大,后一个取代基的取代基更靠前打错了,是-C(CH3)2CH2CH3和-CH2CH(CH3)CH3 英文翻译 梅菜笋丝 图像PS,一句话前面加几个字,急帮PS一下,把请你吃哈根达斯改成请全班吃哈根达斯,急 噶的读音 “笋”的英语单词是什么? 准噶尔盆地和塔里木盆地的成因是什么? 噶的读音为 英语翻译hull 是指果实类的壳吧能用在这里修饰笋的壳吗?请大家给点在国际贸易中,关于笋壳的常用词汇吧 "你是指"笋壳鱼"吗?应该是"blue code"如果我没记错的话..." 不好意思不是的,我的 几个字或者一句话加上一个美女的图,叫什么像这个 准噶尔盆地 怎么读 英语翻译纯鲜榨雪梨汁纯鲜榨凉瓜雪梨汁纯鲜榨苹果甘笋汁纯鲜榨西芹甘笋汁柠七可乐煲姜鲜奶加蛋橙汁西米露麦片鲜奶什果宾治薄荷宾治薄荷七喜红豆冰什果西米露柠蜜西洋菜蜜西柚汁柠 奥运五环中的绿环代表的是澳洲还是大洋洲?越详细越好,最好把国际规定也弄上来. 类是于街霸里的哈都跟 午休噶 一类的发音还有什么 哈都跟 和 午休噶 是什么意识? 结婚和笋用英文怎么写 三个不平等条约的签订对近代中国社会性质的影响是什么 什么是铁制剂 四川盆地和塔里木盆地的差异有哪些?从民居,服饰,饮食,文化等方面来考虑 电磁吸盘吸在玻璃上为什么要排干空气 促进离子铁吸收的因素有哪些? 四川盆地和塔里木盆地区别地形特点,气候类型,干湿状况,温度带,主要河流及特征,主要农作物 ps中ctrl+shift+6什么意思? 已知有一芳香烃结构式为CxHy,怎么由它得到y≤2x-6?我想知道为什么y要小于等于2x-6 四川盆地及塔里木盆地自然环境要素的异同自然环境要素包括气候,土壤,地形,水文,植被. ps里ctrl+a+c+v是什么意思? 芳香烃的结构式是否一定的画苯环,谢C6H5. 四川盆地和塔里木盆地分别是在什么温度带 有理数减法概念谁能给我一些有理数减法的概念,越多越好, 英语翻译274.It is not unusual for you to work for an organization that has a multicultural workforce. 相遇是缘 学着去珍惜所以的缘份.的英文翻译
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘