Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。
1、Spark的Shuffle设计
Spark Shuffle过程也叫作宽依赖过程,Spark不完全依赖于内存计算,面临以上问题时,也需要Shuffle过程。
2、Spark中哪些算子会产生Shuffle?
只要这个算子包含以下四个功能之一:必须经过Shuffle
进行join:join、fullOuterJoin、 leftOuterJoin 、rightOuterJoin
大数据量全局分组:reduceByKey、groupByKey
大数据量全局排序:sortBy、sortByKey
大数据量增大分区:repartition、coalesce
3、Spark中有哪些shuffle【分类的】?
Spark 0.8及以前 Hash Based Shuffle
Spark 0.8.1 为 Hash Based Shuffle 引入 File Consolidation 机制
Spark 1.1 引入 Sort Based Shuffle ,但默认仍为 Hash Based Shuffle
Spark 1.2 默认的 Shuffle 方式改为 Sort Based Shuffle
Spark 1.4 引入 Tungsten-Sort Based Shuffle 直接使用堆外内存和新的内存管理模型,节省了内存空间和大量的gc,提升了性能
Spark 1.6 Tungsten-sort 并入 Sort Based Shuffle
Spark 2.0 Hash Based Shuffle 退出历史舞台
1)Hash Based Shuffle
特点:没有排序,只分区,每个Task按照ReduceTask个数生成多个文件【M * R】
优点:简单,数据量比较小,性能就比较高
缺点:小文件非常多,数据量比较大性能非常差
2) Hash Based Shuffle 【优化后的,File Consolidation机制
3) Sort Based Shuffle [目前最新的]
Shuffle Write + Shuffle Read
Shuffle Write:类似于MR中的Map端Shuffle,但是Spark的 Shuffle Write 有3种,会根据情况自动判断选择哪种Shuffle Write
Shuffle Read:类似于MR中的Reduce端Shuffle,但是 Spark的 Shuffle Read 功能由算子来决定,不同算子经过的过程不一样的。
4、Spark 2以后的Shuffle Write判断机制:
第一种:SortShuffleWriter:普通Sort Shuffle Write机制
排序,生成一个整体基于分区和分区内部有序的文件和一个索引文件
大多数场景:数据量比较大场景 与MR的Map端Shuffle基本一致
特点:有排序,先生成多个有序小文件,再生成整体有序大文件,每个Task生成2个文件,数据文件和索引文件
Sort Shuffle Write过程与MapReduce的Map端shuffle基本一致
第二种:BypassMergeSortShuffleWriter
类似于优化后的Hash Based Shuffle,先为每个分区生成一个文件,最后合并为一个大文件,分区内部不排序
条件:分区数小于200,并且Map端没有聚合操作
场景:数据量小
跟第一个相比,处理的数据量小,处理的分区数小于200 ,不在内存中排序。
第三种:UnsafeShuffleWriter
钨丝计划方案,使用UnSafe API操作序列化数据,使用压缩指针存储元数据,溢写合并使用fastMerge提升效率
条件:Map端没有聚合操作、序列化方式需要支持重定位,Partition个数不能超过2^24-1个
在什么情况下使用什么ShuffleWriter 呢?
ShuffleWriter的实现方式有三种:
BypassMergeSortShuffleWriter
使用这种shuffle writer的条件是:
(1) 没有map端的聚合操作
(2) 分区数小于参数:spark.shuffle.sort.bypassMergeThreshold,默认是200
UnsafeShuffleWriter
使用这种shuffle writer的条件是:
(1) 序列化工具类支持对象的重定位
(2) 不需要在map端进行聚合操作
(3) 分区数不能大于:PackedRecordPointer.MAXIMUM_PARTITION_ID + 1
SortShuffleWriter
若以上两种shuffle writer都不能选择,则使用该shuffle writer类。
这也是相对比较常用的一种shuffle writer。
5、 Shuffle Read:类似于MapReduce中的Reduce端shuffle
MR:Reduce端的shuffle过程一定会经过合并排序、分组
需求:统计每个单词出现的次数,不需要排序,依旧会给结果进行排序
Spark:Shuffle Read具体的功能由算子来决定,不同的算子在经过shuffle时功能不一样
reduceByKey:Shuffle Read:只分组聚合,不排序
sortByKey:Shuffle Read:只排序,不分组
repartition:Shuffle Read:不排序,不分组