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

1/10计算资源,1/3耗时,Spark颠覆MapReduce保持的排序记录

HTML文档下载 WORD文档下载 PDF文档下载
Spark在内存计算更具优势已众所周知,然而在许多人心里,磁盘数据计算上,Hadoop仍然老当益壮。为了打破这个误解,近日Databricks与AWS一起完成了一个Daytona Gray类别的Sort Benchmark,并创造了该测试的新纪录。

在过去几年,Apache Spark的采用以惊人的速度增加着,通常被作为MapReduce后继,可以支撑数千节点规模的集群部署。在内存中数据处理上,Apache Spark比MapReduce更加高效已经得到广泛认识;但是当数据量远超内存容量时,我们也听到了一些机构在Spark使用上的困扰。因此,我们与Spark社区一起,投入了大量的精力做Spark稳定性、扩展性、性能等方面的提升。既然Spark在GB或TB级别数据上运行良好,那么它在PB级数据上也应当同样如此。

为了评估这些工作,最近我们与AWS一起完成了一个Sort Benchmark(Daytona Gray类别)测试,一个考量系统排序100TB数据(万亿条记录)速度的行业基准测试。在此之前,这项基准测试的世界记录保持者是雅虎,使用2100节点的Hadoop MapReduce集群在72分钟内完成计算。而根据测试结果得知,在使用了206个EC2节点的情况下,Spark将排序用时缩短到了23分钟。这意味着在使用十分之一计算资源的情况下,相同数据的排序上,Spark比MapReduce快3倍!

此外,在没有官方PB排序对比的情况下,我们首次将Spark推到了1PB数据(十万亿条记录)的排序。这个测试的结果是,在使用190个节点的情况下,工作负载在短短不到4小时内完成,同样远超雅虎之前使用3800台主机耗时16个小时的记录。同时,据我们所知,这也是公用云环境首次完成的PB级排序测试。

Hadoop World Record Spark 100 TB Spark 1 PB
Data Size 102.5 TB 100 TB 1000 TB
Elapsed Time 72 mins 23 mins 234 mins
# Nodes 2100 206 190
# Cores 50400 6592 6080
# Reducers 10,000 29,000 250,000
1.42 TB/min 4.27 TB/min 4.27 TB/min
Rate/node 0.67 GB/min 20.7 GB/min 22.5 GB/min
Sort Benchmark Daytona Rules Yes Yes No
Environment dedicated data center EC2 (i2.8xlarge) EC2 (i2.8xlarge)

为什么会选择排序?

排序的核心是shuffle操作,数据的传输会横跨集群中所有主机。Shuffle基本支持了所有的分布式数据处理负载。举个例子,在一个连接了两个不同数据源的SQL查询中,会使用shuffle将需要连接数据的元组移动到同一台主机;同时,类似ALS等协同过滤算法同样需要依赖shuffle在网络中发送用户或产品的评级(ratings)和权重(weights)。

大部分数据管道开始时都会有大量的原始数据,但是在管道处理过程中,随着越来越多不相干数据被过滤,或者中间数据被更简洁的表示,数据量必然会减少。在100TB原始数据的查询上,网络上shuffle的数据可能只有100TB的一小部分,这种模式也体现在MapReduce的命名。

然而,排序却是非常有挑战的,因为数据管道中的数据量并不会减少。如果对100TB的原始数据进行排序,网络中shuffle的数据必然也是100TB。同时,在Daytona类型的基准测试中,为了容错,不管是输入数据还是输出数据都需要做备份。实际上,在100TB的数据排序上,我们可能会产生500TB的磁盘I/O及200TB的网络I/O。

因此,基于上述原因,当我们寻找Spark的测量标准和提升办法时,排序这个最苛刻的工作负载成为了对比的不二之选。

产生如此结果的技术实现

在超大规模工作负载上,我们投入了大量的精力来提升Spark。从细节上看,与这个基准测试高度相关的工作主要有3个: 

首先及最关键的,在Spark 1.1中我们引入了一个全新的shuffle实现,也就是基于排序的shuffle(SPARK­2045)。在此之前,Spark做的是基于哈希的shuffle实现,它需要在内存中同时保持P(reduce的分割数量)个缓冲区。而在基于排序的shuffle下,任何时候系统只使用一个缓冲区。这个操作将显著地减少内存开销,因此同一个场景下可以支撑数十万任务(我们在PB排序中使用了2.5万个任务)。

其次,我们修订了Spark的网络模型,通过JNI(SPARK­2468)使用基于Netty的Epoll本地端口传输。同时,新的模型还拥有了独立的内存池,绕过了JVM的内存分配器,从而减少垃圾回收造成的影响。

最后但同样重要的是,我们建立了一个外部shuffle服务(SPARK­3796),它与Spark本身的执行器完全解耦。这个新的服务基于上文所述的网络模型,同时,在Spark本身的执行器忙于GC处理时,它仍然可以保证shuffle文件处理的继续执行。


通过这三项改变,我们的Spark集群在map阶段单 节点可以支撑每秒3GB的IO吞吐,在reduce阶段单节点可以支撑1.1GB,从而榨干这些机器间10Gbps的网络带宽。

更多的技术细节

TimSort:在Spark 1.1版本中,我们将默认排序算法从 quicksort转换到TimSort,它是合并排序和嵌入排序的一个衍生。在大部分现实世界数据集中,TimSort比quicksort更加高效,在部分排序数据中表现则更为优秀。不管在map阶段还是Reduce阶段,我们都使用了TimSort。

缓存位置的利用:在排序基准测试中,每条记录的大小都是100字节,而被排序的键是前10个字节。在排序项目的性能分析阶段,我们注意到缓存命中率不如人意,因为每次比较都需要进行一个随机的对象指针查询。为此,我们重新设计了记录在内存的布局,用16字节长度(两个长整形)的记录来表示每条记录。在这里,前10个字节代表了排序的键,后4个字节则代表了记录的位置(鉴于字节顺序和符号,这点并不容易发现)。这样一来,每个比较只需要做一次缓存查询,而且它们都是连续的,从而避免了随机的内存查询。

使用TimSort和新的布局方式来利用缓存命中,排序所占用的CPU时间足足减少了5倍。

大规模下的容错机制:在大规模下,许多问题都会暴露。在这个测试过程中,我们看到因为网络连通问题出现的节点丢失,Linux内核自旋,以及因为内存碎片整理造成的节点停滞。幸运的是,Spark的容错机制非常好,并且顺利的进行故障恢复。

AWS的能量:如上文所述,我们使用了206个i2.8xlarge实例来跑这个I/O密集测试。通过SSD,这些实例交付了非常高的I/O吞吐量。我们将这些实例放到一个VPC放置组中,从而通过单SR-IOV增强网络性能,以获得高性能(10Gbps)、低延时和低抖动。

Spark只能在内存中大放异彩?

这个误解一直围绕着Spark,特别是刚进入社区中的新人更是如此认为。不错,Spark因为内存计算的高性能闻名,然而Spark的设计初衷和理念却是一个通用的大数据处理平台——不管是使用内存还是磁盘。在数据无法完全放入内存时,基本上所有的Spark运算符都会做一些额外的处理。通俗来说,Spark运算符是MapReduce的超集。

如本次测试所示,Spark可以胜任集群内存大小N倍的数据集处理。

总结

击败Hadoop MapReduce集群创造的大规模数据处理记录不仅是对我们工作的一个证明,也是对Spark承诺的一个验证——在任何数据体积,Spark在性能和扩展性上都更具优势。同时,我们也希望在用户使用过程中,Spark可以带来时间和开销上的双节省。

博文链接: Spark Breaks Previous Large-Scale Sort Record(翻译/童阳 责编/仲浩)

更多Spark及Hadoop信息可关注2014年12月12-14日在北京召开的2014中国大数据技术大会(暨第二届CCF大数据学术会议),届时百余位国内外顶尖技术人员、学术大师将送上第一手的实践分享。


免费订阅“CSDN云计算(左)CSDN大数据(右)”微信公众号,实时掌握第一手云中消息,了解最新的大数据进展!

CSDN发布虚拟化、Docker、OpenStack、CloudStack、数据中心等相关云计算资讯,     分享Hadoop、Spark、NoSQL/NewSQL、HBase、Impala、内存计算、流计算、机器学习和智能算法等相关大数据观点,提供云计算和大数据技术、平台、实践和产业信息等服务。        

Zipalign使用方法-SDK中的APK文件优化工具 Android蓝牙控制之2.X或以上 Android数组排序常见方法 使用OpenGL开发一个指南针 Android自绘GridView控件 Android平板开发注意事项 Android控件TextProgressBar进度条上显文字 Android内存管理-SoftReference的使用 反射在Android开发中的利弊 intent调用代码总结二 Android缩略图类源代码 Android多人项目开发指导 AsyncTask对比Thread加Handler Android Drawable叠加处理方法 android.os.Debug调试工具使用方法 Android多点触控开发原理 inent调用代码总结,不断完善中 onRetainNonConfigurationInstance和getLastNonConfigurationInstance Android中String资源文件的format方法 Android工程内嵌资源文件的两种方法 Android AIDL全攻略三 - AIDL框架 Android AIDL全攻略二 - Service绑定 自定义Android主题风格theme.xml方法 Android开发之模拟按下Home键的效果 Android AIDL全攻略一 Android Picture和PictureDrawable的用处 Android自定义View以及layout属性全攻略 Android通过Intent发送电子邮件含附件 Android调试技巧之Eclipse行号和Logcat Android Txt文本读写类源代码 Android游戏开发之旅20 双按事件捕获 enhydra4.0+jbuilder4.0+kelp4.0. 类型不匹配? 请教各位高手关于对象序列化的问题! 现在很急切,多谢各位!-- 请问这条select语句(包含compute)的结果如何显示在屏幕上? cn类型不匹配? 请问高手: 如何在VB.NET中调用象GetObject那样的函数 300分!!急急急!!各位大虾有提供关于报表的控件带源码的 请问各位大侠,怎么用批处理的方式开启一个后台服务程序? 如何对access文件加密!!!! 再次送分:如何求一个已打开ADO记录集中当前记录的行号或索引? 急!急!在用户界面线程中,如何接收其它窗口发送的消息? 我的toolbar潜入一个对话筐怎么是灰的???? :)请问:网上能不能找到破解了的Pro-e2000(中文版)啊? 关于退格键! java与C的问题,怎么办? VC里如何调用std里的operator new和operator delete 有沒辦法使成員函數只供指定的 class 呼叫! 关于DELPHI中的DBGRID控件 关于enhydra4.0+kelp4.0+jbuilder4.0。 能不能用Mscomm控制并口,如果行,应该怎样将一串ASCII值发送到并口;如果不行,能用其它方式吗?(最好能提供例程)多谢了。 求救,请教ado中有关事务的问题。 异想天开的问题???,进来就给分!!!! 请教高手,我如何将*.swf文件从网下摘下? 集线器与交换机怎样级联? 请问如何用RasDial 类似冰河“搜索主机”的功能怎么实现啊? 如何利用socket截获80端口数据?请给出源代码。 水晶报表的问题 Help的窗口 送分:关于数据库中的数据在前台显示的问题,敬请高手指教 请问一下各位PB FANS,PB中的自定义事件中的extenal选项有何作用? Label的小问题,以后给分,现在确实没分了。 测试a 有沒辦法使成員函數只供指定的 class 呼叫! 请问如何给listview添加鼠标拖拽功能,如从本视图中拖走一行? Jbuild and Visual Age for Java 只使用数据库表单如何不带环境? 为什么在Cmd.exe 下可以运行,但是在ASP里面却没有办法写进数据???斑竹怎么只提供4页的讨论内容呢?? 救急,启动winNT时候inetinfo.exe总是共享冲突,该咋解决? 如何防止内存泄漏 帮忙看诊断一下遇到的问题。 Fatal error C1010: unexpected end of file while looking for precompiled header directive是什么意思?怎么改正? 关于数据窗口 D3D8的疑問 作动态连接库链接时出错? rLabel的小问题,以后给分. WebSphere 4.0中是否已经直接实现了connection pool CSDN的bug报告:您不能给自己加分...... ORACLE里的中文字符集怎么解决?高分求救!!! 身为一个程序员,谈谈这些年里你所拥有的成功经历!见识一下CSDN牛人总汇! 这是怎么回事呀? 食品干燥剂遇水真的会爆炸吗 在化学实验室,主要是要跟三氯,甲醇,苯这些化学物质,我想知道,带个什么样的防毒面具能把这些都防了哪位朋友要是知到,最好能给推荐下, 浓硫酸可将亚铁离子氧化为铁离子吗? 各价态的铬离子的颜色及化学式是?求可靠回答. 哪两种无色液体混合会生成有色的?液体是没有毒的哦! 一道化学基本实验操作题若用镊子直接将固体药品投入试管,会有什么后果? 求各个价态的铬的化合物或离子的颜色例如(Cr2O7)2- 为橙色等等越多越好,谢过了 急:无色变有色的液体有没有,对人体无害并且无色无味的液体?当我加入别的什么东西时,它会变色?我想用这种液体,写一些别人看不到的字.当我想看时,用别的什么东西一擦,字迹就会呈现出来. 被氧化的铁与稀硫酸反应的化学方程式?急用 二价铬是什么颜色 三价铬与六价铬有什么区别 亚铁离子如何被氧化为铁离子?写出一个化学方程式. 铬酸根离子什么颜色 化学试验操作视频那里有?1.自制过滤器10毫升粗食盐水 2.众核反应试验 3.探究溶解过程中的吸热预防热现象 4.二氧化碳的制备 5.配置60克5%的氯化钠容液 6.氧化铜与硫酸反应 三氧化硫与磷的化学反应方程式能反应的话...化学方程式写下.(要配平的) 科技创新创意方案 化学中颜色反应的实验操作过程是什么?说一下实验流程即可打错啦是焰色反应 氢气爆炸验氢气是不是一定要遇到明火才能爆炸?用两根导合在一起,通上正负静电,这样能爆炸吗?里面有水还会爆炸不 求一个初中物理创新实验方案 实验操作有错吗? 为什么铁单质和硝酸直接生成3价铁离子?而不是先生成2价铁离子,再被氧化为3价铁离子? 水发电是什么原理?无色无味,还可以喝,红色液体不会导电,手摸了也没事.大哥大姐们,帮一下,解答一下. 以下说法中能证明无色透明液体是纯净水的是A.测得该液体pH=7B.电解该液体得到氢气和氧气,且其体积比为2:1C.向其中投入金属钠,钠于液面上迅速游动,并发出丝丝声D.在l.0l×105Pa压强下 关于单质铁溶于稀硝酸反应的离子方程式aFe +bNO3- +cH+ == dFe2+ +fFe3+ +gNO +hN2O +kH2O问1、b、c、d、f的关系式问2、d、f、g、h的关系式 请问水是无色无味液体这句话对吗? 下列实验操作正确的是A.不慎将浓硫酸粘到皮肤上,立即用大量的水冲洗B.在食盐溶液蒸发结晶的过程中,当蒸发皿中出现较多固体时即停止加热C.先在天平托盘上放一张洁净的纸,再把氢氧化钠 Fe与浓或稀硝酸反应能被氧化成+3价铁离子吗?+5价N能被还原成NO2吗? 水在常温下是无色无味的液体 水分子是无色透明液体RT 硝酸能将二价铁离子氧化为三价离子吗?那硫酸亚铁与硝酸反应生成啥啦?硫酸铁、NO、H2O吗?我咋配不平啊? 为什么铁与盐酸反应生成二价铁,铝与盐酸反应却生成三价铝?不是具有强氧化性,才能从零价氧化成三价? 水是一种无色无味的液体,水还有什么性质?(1条就够) 水是无色透明液体,水分子也是无色透明液体.这句话对吗?为什么 三价铝离子与水反应的方程式 为什么水是无色无味透明的液体?一种固体物质既不吸收也不散射光,那么这种物质看起来就是透明的.纯硅对光具有极强的吸收力:这是因为纯硅中的电子吸收了可见光而实现了能级跃迁.固体 三价铬在pH等于多少时开始生成氢氧化铬沉淀? 什么和什么离子对铝片和盐酸反应无影响 什么是六抓六防 三价的铬离子水解的PH是多少? 干燥剂遇水多长时间爆炸 三价铬离子有何特征反应请问如何检验溶液中是否含有三价铬离子,(万分火急) 使三价铬完全沉淀的最低PH值多少? 初中化学 这几个都要 化学实验室为什么用棕色瓶防光照而不用其他的颜色? 化学试验操作的注意事项---急急急!过滤水的实验 正一价钠离子和负三价的氮离子谁的半径大 怎样定性检验三价铬离子?要用什么试剂? 下列实验操作或对实验事实叙述正确的是(化学)(1)下列实验操作或对实验事实叙述正确的是① 用稀硝酸清洗做过银镜反应实验的试管;② 配制浓硫酸和浓硝酸的混合酸时,将浓硫酸沿器 初中化学,谢谢谢谢谢谢 为什么化学实验室防倒吸用四氯化碳和水是不是四氯化碳吧气体吸收了? 下列实验操作中错误的是( ) 下列实验操作中错误的是( )A.蒸发操作时,应使混合物中的水分完全蒸干后,才能停止加热B.蒸馏操作时,应使温度计水银球靠近蒸馏烧瓶的支管口处C.分液 钠离子与氮离子哪个半径大 求问怎样定性检验三价铬离子?要用什么试剂? 铁氰化钾中的三价铁离子能氧化金属单质钴吗 氮离子有哪些价态 狮王陶瓷的u+六防瓷砖是什么意思 三价铁离子加什么可变成铁单质 "Na3N中钠离子与氮离子半径相等"为什么错 如何检验铬离子?铬及其它含铬的物质是什么颜色? 三价铁离子如何到铁单质?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn