这是我参与「第四届青训营 」笔记创作活动的第6天
6.1 shuffle概述
1.MapReduce概述
2004年谷歌发布了《MapReduce:Simplified Data Processing on Large Clusters》论文,在开源实现的MapReduce中,存在Map、Shufle、Reduce三个阶段。
Map阶段
Map阶段,是在单机上进行的针对一小块数据的计算过程。
2.shuffle阶段
Shufle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备。
3.Reduce过程
reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据。
4.为什么shuffle对性能非常重要
1)M * R次网络连接 2)大量的数据移动 3)数据丢失风险 4)可能存在大量的排序操作 5)大量的数据序列化、反序列化操作 6)数据压缩
5.总结
在大数据场景下,数据shuffle表示了不同分区数据交换的过程,不同的shuffle 策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle 是支撑spark进行大规模复杂数据处理的基石。
6.2 shuffle算子
1.shuffle算子分类
spark中会产生shuffle的算子大概可以分为四类:
shuffle算子应用
1)spark源码中RDD的单元测试
2)spark源码中PairRDDFunctions的单元测试
2.spark中对shuffle的抽象——宽依赖、窄依赖
1)窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
2)宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
算子内部的依赖关系
➢ShuffleDependency
CoGroupedRDD
Cogroup
fullOuterJoin、rightOuterJoin、 leftOuterJoin
join
ShuffledRDD
combineByKeyWithClassTag
combineByKey
reduceByKey
Coalesce
sortByKey
sortBy
Shuffle Dependency 构造
A single key-value pair RDD, i.e. RDD[Product2[K,V]],
Partitioner (available as partitioner property),
Serializer,
Optional key ordering (of Scala's scala.math.Ordering type),
Optional Aggregator,
mapSideCombine flag which is disabled (i.e. false) by default.
Shuffle Dependency 构造-Partitioner
两个接口:numberPartitions,getPartition
经典实现:HashPartitioner
Shuffle Dependency 构造-Aggregator
createCombiner:只有一个value 的时候初始化的方法
mergeValue:合并一个 value到Aggregator中
mergeCombiners:合并两个Aggregator