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

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。

Delphi的Bug-Tthread Suspend方法 Email服务器的简单实现-Delphi资料 Hook的制作-Delphi资料 INI文件的应用-Delphi资料 NT中的关闭计算机,重新登陆的实现-Delphi资料 Windows 系统方面-Delphi资料 Windows外壳扩展编程-Delphi资料 避免二次运行-Delphi资料 编程实现文件关联-Delphi资料 编写定制的文件流实现文件读写加密-Delphi资料 采用多线程进行数据采集-Delphi资料 产生临时文件名-Delphi资料 程序不出现在任务栏-Delphi资料 程序缩小为任务条右下角的小图标-Delphi资料 得到 Windows 用户名和序列号-Delphi资料 得到windows临时路径-Delphi资料 得到Windows用户名和序列号-Delphi资料 得到计算机的名字和ip-Delphi资料 得到内存的 Status-Delphi资料 得到上一个激活的组件-Delphi资料 得到在内存中运行的所有应用程序的handle-Delphi资料 调用控制面板项目大全-Delphi资料 动态改变当前显示模式-Delphi资料 动态改变屏幕分辨率-Delphi资料 动态建立不常用的对象-Delphi资料 对控制面板进行操作-Delphi资料 返回程序执行参数-Delphi资料 防止 Win95 显示严重错误-Delphi资料 改变操作系统日期-Delphi资料 改计算机名-Delphi资料 关闭 Windows-Delphi资料 **********四大网站被黑!!!********** 怎麼寫這兩條SQL語句;(1)顯示當前數據庫?(2)顯示當前所有用戶表? 急,謝謝 送分问题,绝对给分! 如何才能不改变字体大小? 数据窗口有bh(编号),name(名称)两列,编号是string型,用什么方法可快速查找出bh中的最大值?只准对数据窗口操作。 delphi(dll) 大话爱情大结局 ??如何编写邮件服务器? createfont怎样创建一个随意宽高的字体? 急,请问有函数可取字符串后面N位字符吗?在线等待 怎样显示报表页总数问题 在打印中如何实现实现小计(即每页显示金额的总和)100分 问一个简单的问题,关于初始化 请问谁有动态树状目录的原码啊,急需!! 什么问题,怎么解决? 西瓜:有人要求我贴你的没穿外套没穿鞋子的照片 就是你说生气的那张 贴不贴啊? 怎样将一个十进制数转换为二进制数,并将二进制数中的每一位单独取出来? GetProcAddress在VB中的使用? excel单元格格式问题 用按钮保存网页的问题 用c++ builder和access.数据表中的记录多了之后,应用什么方案将之备份以及恢复? 以下ASP在Win2000server上运行报错请问大家为什么??? 在指定位置输出文本 怎么办? 如何启动和终止一个NT服务 .Net——又一个起跑线 怎么样注册jsp上的jdbcoracle驱动 什么问题,怎么解决? 我的爱情大结局----失败爱情原闯文章 在学习了2个月的delphi后,总结四大问题! OnPaint()的问题?为什么我的程序要刷很多次才能得到正确的结果? win2000 Server中的终端服务问题,急,所有的终端都趴下了! 深入浅出MFC 100分﹕vs.net正式版的產品密鑰 怎样动态改变下拉框中的值? 如何将已有的程序(有源程序)封装成ActiveX控件? 讨论一个数据库建模的使用工具问题? 关于Flash的Action的小问题 怎样为xslt中的超联接加上参数? 问题 如何设置datagrid行背景颜色? 安装程序安装完运行显示“运行时错误'380':无效属性值”是怎么回事? win2000+ms proxy 2.0问题 API函数 ReadFile的pb的中文说明谁有,告诉我好吗? 在线求助 在线等待,急 关于计算字段,急! datawindow的scrollvertical.setrow,不能触发rowfocuschanged事件,why? help:can you tell me how can i get the IDE of WinSDK? 有些人的言论很具有误导性,根据今年的就业形势,软考证书还是比较值钱的 请看这段代码?谢谢 甲班学生不满50人,在一次课外活动中,参加各类运动的占全班人数的三分之一,下面还有参加绘画的占全班人数的七分之一,参加唱歌的占全班人数的二分之一,余下的参加跳舞,参加跳舞的有多 假如你是某一地方政府的决策者,你觉得作为农村可以通过哪些途径改变农村人口大量向城市迁移的现状呢?(写一篇500~1000字的作文) 如图,从无阴影的正方形中选一个,与图中5个有阴影的正方形折成一个正方体的不同选法有( ) 公园里都有什么生物,生活环境是什么?(急!只要两个,生活环境就是土壤什么的. 请你自定方案,测量假期中每天上午9点的风向,作好记录.我想问的是,谁能够提供一下1月25日~1月31日的风向,我前面还没有做到,所以没有仔细看题目,现在我一个朋友问我这个问题,好的有重赏! 《书虫英汉对照读物》的读后感两篇,最好有中文对照! 各种生物的生活环境请在植物、动物和其他生物中各选5个(两个以上也可以)来介绍其生活环境和生长状况 红光小学五年二班选两名班长.投票时,每个同学只能从四个候选人中挑选两名.这个班至少要有多少学生,才能保证有8个或8个以上的同学投了相同的两名候选人? 选择:5个同样大小的正方体组合成一个图形,无论从哪个位置观察都至少能看到( )个正方形.①1 ②2 ③3 初一寒假作业P26的25题《苍蝇的路程》?2011. 某班选两名班长,投票时,每名同学只能从4名候选人中挑选3名,这个班至少应有多少名同学才能保证至少有8名同学投了相同的两名候选人的票? 如图,共有12个大小相同的正方形,其中阴影部分的5个小正方形是一个正方体的表面展开图的一部分,现从其余得小正方形中任取一个涂上阴影,能够成这个正方体的表面展开图的小正方形有几个 某校在一次课外活动中把学生编为9个组 若每组比预定人数多1人 则所需学生超过200人 若每组比预订人数少一人 则所需学生总数不到190人 求每组学生预定人数是多少? 一元一次不等式组解 某班要从11名侯选人中投票选举1名班长.如果没名同学只能投票选1名候选人,哪么这个班应该有多少名学生.才能保证必有4名或4名以上的同学投相同侯选人的票 要有算式 深圳报业集团2013寒假作业七年级上册英语答案 某校在一次春游中把学生编为9个组,若每组比预定的人数多一人,则学生总数超过200人;若每组别预定少一人 给你这个图形的三视图,如何知道这个几何体有几层?如何球这个几何提示有多少个立方体组成的希望可以给我帮助啊 如图是5个大小相同的正方形组成的图形能否用一条直线将图分成面积相等的两部分(两种)图形:一个大正方形(是四个小正方形组成的)右上方还有一个小正方形 生物的生活环境是指什么A.生存地点 B.影响生物生活的非生物因素 C.影响生物生活的因素 已知一个立体图形(由大小、形状完全相同的小正方体组成)的正视图和俯视图(三视图里知道两个)请问这个立体图形最多由多少小正方体组成?最少?具体说来,是解题的基本策略。 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,那么足球和排球各几个?列方程解应用题 设x. 如果好,我会提高悬赏分数. 怎样由三视图判断几何体或几何体组成的小正方体个数?别用什么层、列、行的,我看不懂,最好有图,三视图这一块我一窍不通啊!我的意思是由主视图,左视图画俯视图或由主视图俯视图画左 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,足球和排球各有几个?要列方程的 上图反映的是某校六1班学生在课外活动中参加各种兴趣小组的情况,用什么表示全班同学的总人数,用什么表示参加各小组的学生人数占全班总人数的百分比.2.参加舞蹈小组和美术小组的学生 2014七年级寒假作业答案? 体育室有篮球21个,足球的个数比篮球个数的3倍少8个,又比排球个数的2倍多5个,那么足球和排球个几个?(方程) 某校参加全市中学生篮球比赛,共参加了16场比赛积28分,规定一场积2分,输一场积1分 该学校对胜,负各多少 2014寒假作业答案七年级 书虫·牛津英汉双语读物:曾达的囚徒答案 小学作文写人的(同学)要求400字,半命题,小______如:小淘气,小机灵支持复制.汗- -不是考试,练笔,要我自己写的就别来灌水。 聪聪同学做了这样一个游戏,她在地上任意画个△ABC(如图所示),并作出了∠A的平分线与BC的垂直聪聪同学做了这样一个游戏,她在地上任意画个△ABC(如图所示), 并作出了∠A的平分线与BC 轻松快乐过寒假六年级上的英语教教我!练习八的第二大题,练习九的第一、二大题,练习十的第一大题,练习十二第一、二大题,练习十四的一、二、四大题,练习十五的第一、三大题. 小学四到六年级以上的孩子推荐哪些课外读物比较合适? 篮球赛比赛规则--视频解说 电子跳蚤游戏盘是如图所示的三角形abc电子跳蚤游戏盘是如图所示的△ABC,AB=AC=BC=5.如果跳蚤开始时在BC边的P0处,BP0=2.跳蚤第一步从P0跳到AC边的P1(第1次落点)处,且CP1=CP0;第二步从P1跳到AB “起飞”的英语怎么说? 三人制篮球赛竞赛规则 由五个正方体拼成的立体图形,从上面看到的形状是横着的三个正方形,从侧面看到的形状是竖着的三个正方形那么从正面看到的是什么形状 起飞用英语怎么说 6个面积完全相等的正方形围成的立体图形就是正方体 一个立体图形,从上面看的形状是4个连着的小正方体(两横两竖),从正面看的形状是竖着两个,横着1个.最多需要几个小正方体,最少呢? 一:有趣的人体喻词1:骨肉 1:喻指真诚.勇气口齿 2:喻指说话的本领喉舌 3:喻指技艺.本领肝胆 4:对人和事的感情咽喉 5:喻指头绪.条理首脑 6:喻指最亲的人皮毛 7:喻指重要的人物腹背 8:喻指暗 2010年某地区的篮球队共进行了22个场次的比赛,比赛规则:胜一场积2分,输一场积1分.小蜜一直在关注比赛她认为会有一个球队出现胜场积分等于负场积分.你认为可能吗?用一元一次方程) 用四个正方体拼成一个图形,使之从某一个方向看到的形状是两个横着的并排正方形 小学四至六年级语文必知的课外知识?急 某市中学生篮球联赛规定:每队胜一场得2分,负一场得1分,实验中学队15场比赛得分24分,问该队负了几场?要过程(方程) 明明和聪聪每人有30张卡片,明明给聪聪5张后,聪聪比明明多多少张? 常熟市08年六年级语文课外知识能多则多,要有用的,可能考到的! 镜湖小学六(8)班的同学准备选编一本自己的文集—《让我们荡起双桨》,他们对作文进行编辑、分类,设计了“感受生命”、“体会亲情”、“走进名人”等栏目,请你再设计一个栏目.要求 想写一篇作文的提纲 写人作文的不要太长 明天就要用 今天,刘慧,靳娇和婉玉来到我家.因为我在学校常常和他们玩,也算是死党了!所以,我们马上“嘻嘻哈哈”的疯成一团……今天,我就为大家 比如说什么[猜字谜]、[成语知识]啊.(要在六年级知识水平以上的,我要做幻灯!) 一个立体图形从上面看,形状是3个连着的小正方体(横排),从右面看,是三个连着的小正方体(竖排).问:搭这样一个立体图形至少需多少个小立方体 最多需多少个? 原题是多选题 A:4个 B:5 六只篮球队,若采用主客场双循环比赛.则需要安排比赛的场次为? 语文课外知识!小学六年级的!快要升初考了!我急呀!记得加答案!谢谢大师! 用7个同样的小正方体搭成一个立体图形,从正面.后面.左面.上面.右面看都有5个正方形,怎么搭?需要几个? 六个篮球队进行单循环比赛,每两队都要赛一场.如果踢平,每对各的一分,否则胜队的3分,负队的0分.现在比赛已经进行了4轮(每队都已与四个队比赛过),其中有四场球赛踢成平局,并且各队四 还有什么在花园中的生物?有哪些特点? 一立体图像,正上方可看到五个小正方形,右看两个正方形,如果搭这样的立体图形,需多少个小正方体? 求 “书虫· 牛津英汉双语读物《 园会The Garden Party and Other Stories 》 的读后感作者大卫·科波菲尔 David Copperfield
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘