浅析Spark Architecture:Shuffle(一)

作为一个接触Spark将近一年的数据挖掘工程师,Spark在处理海量数据上游刃有余的表现就强烈的吸引着我,当我在使用Spark完成数据项目、训练模型任务的过程中通常会遇到各种各样的问题,相信这些问题每个Spark的新手都会遇到过,有的时候调高driver memory或者executor memory,又或者稍微改动一下代码然后就可以了,但是却始终对其背后的原理不甚了解,这不符合一个合格工程师的应该有的职业素养。

如何理解Spark Shuffle?

在MapReduce中,Shuffle作为连接Map和Reduce的桥梁,它是一个非常占用磁盘I/O网络传输开销的过程,为什么这么说呢?Shuffle的过程分为Shuffle Write和Shuffle Fetch,其中Write对应的是Map端的写入,Map任务的结果会写入到文件中,而Fetch对应的是Reduce端的读取来自Map端任务的结果数据文件。从而,Shuffle的过程便有了这“一写一读”的操作,所以就不难理解为什么Shuffle为何这么占用磁盘和网络传输了。

如果对于Spark的新手可能不太理解Shuffle的过程,下面我以人口普查统计为例,人口普查统计它肯定不是由国家统计局派出一个团队,然后逐一去各个地区统计,这样统计工作就永远都完不成了。虽然大多数人跟我一样都不是人口统计学专业相关的,但是常识告诉我们,它肯定是国家统计局把各个省的统计局通知到北京来,大家一起开一个会,讨论本次统计工作要完成什么任务,需要统计哪些人口指标,最后各省将各自的统计结果递交给北京汇总。

Spark中所谓的Shuffle就发生在北京汇总(聚合)各省递交统计结果的过程中,具体一点说,比如湖南省和江西省的统计结果中有都有年龄分布和性别分布的统计任务,这两个省份把统计任务完成之后写成统计报告文件,然后国家统计局再一个一个读取省份的统计数据报告,国家统计局会把年龄分布的数据交给一个小组汇总处理,把性别分布的数据交给另外一个数据处理。从这个例子中,各个省份的数据统计工作就对应占用磁盘I/O,大量来自地级市、县级单位、乡镇的统计数据不断“写入”省统计局,而向国家统计局递交数据的过程对应网络传输开销,不同类别的数据需要送到对应的小组汇总处理。在这个例子中,不难理解省份对应Map端,国家统计局对应Reduce端。

Hadoop和Spark在Shuffle上的区别

Hadoop的Shuffle过程是Map端的结果首先被写入缓存,当缓存满了之后就启动溢写操作(spilling process),把缓存的数据再写入磁盘,并清空缓存。而Spark 1.01之后,Spark Shuffle的Map任务就不写入缓存了,而是直接写入磁盘文件,最新版本的Spark和老版本的Spark Map端写入磁盘的方式又有所区别。

再者,两者在Map端处理数据的方式也有区别,Hadoop Shuffle的Map端是Sorted -based,会对数据进行排序和合并了之后再写入磁盘文件。Spark Sorted-Based Shuffle在Mapper 端是排序的,包括partition的排序和每个partition内部元素的排序!但在 Reducer 端是没有进行排序所以Job的结果默认不是排序的。Sorted-Based Shuffle采用了 Tim-Sort排序算法,好处是可以极为高效的使用Mapper端的排序成果全局排序。

新老版本Spark Shuffle运行的区别

在Spark 1.2.0之前的Spark Shuffle默认是Hash based,老版本Spark Shuffle的每一个Map任务会根据Reduce任务的数量创建相应的桶(Bucket),Map的结果会写入到这些桶里面,因此桶的数量是m×r,所以Shuffle的过程会产生大量的小文件,导致大量内存消耗和GC 的巨大负担。所以,此时Spark最为紧要的问题是解决Map端生成大量文件的弊端,减轻GC负担。

而新版本(从Spark 1.2.0开始)的Spark Shuffle逐渐抛弃Hash based,拥抱Sort based(默认),它与Hadoop Shuffle思想一致。在Spark2.X版本中只有SortShuffleManager,已经没有了Hash-Based Shuffle Manager 了。它的设计思想则是每个Map任务只创建一个桶,意味着Map任务的结果只写入两个文件,数据文件和索引文件,一个数据文件用于记录Map任务的结果,另外一个索引文件用于记录数据文件中的分区信息。

所以,对比新老版本的Spark Shuffle,老版本的Shuffle所产生的文件数量是新版本的r/2倍$(\frac{mr}{m2})$,新版本的Spark Shuffle为文件系统减少了不少压力。

推荐文章

  1. [Spark性能调优] 第三章 : Spark 2.1.0 中 Sort-Based Shuffle 产生的内幕 - 無情 - 博客园
  2. Spark性能优化指南——基础篇 - 美团技术团队
  3. RDD Programming Guide - Spark 2.3.0 Documentation
  4. Apache Spark源码走读之24 -- Sort-based Shuffle的设计与实现 - 徽沪一郎 - 博客园
  5. SparkInternals/4-shuffleDetails.md at master · JerryLead/SparkInternals · GitHub
  6. Spark Architecture: Shuffle | Distributed Systems Architecture
------本文结束,欢迎收藏本站、分享、评论或联系作者!------
赠人玫瑰 手有余香
0%