这是我参与「第四届青训营 」笔记创作活动的第10天。
第六节课「大数据 Shuffle 原理与实践」的内容主要包含 4 个方面:Shuffle 概述、Shuffle 算子、Shuffle 过程、Push Shuffle。这篇文章包括 Shuffle 概述、Shuffle 算子、Shuffle 过程的内容。
Shuffle 概述
在开源实现的 MapReduce 中,存在 Map、Shuffle、Reduce 三个阶段。
- Map 阶段,是在单机上进行的针对—小块数据的计算过程
- Shuffle 阶段,在 map 阶段的基础上,进行数据移动,为后续的 reduce 阶段做准备
- Reduce 阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据
数据 shuffle 表示了不同分区数据交换的过程,不同的 shuffle 策略性能差异较大。目前在各个引擎中 shuffle 都是优化的重点,在 spark 框架中,shuffle 是支撑 spark 进行大规模复杂数据处理的基石。
Shuffle 算子
-
常见的触发 shuffle 的算子
-
repartition
- coalesce、repartition
-
ByKey
- groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
-
Join
- cogroup、join
-
-
Shuffle Dependency
-
创建会产生shuffle的RDD时,RDD会创建 Shuffle Dependency 来描述 Shuffle 相关的信息
-
构造函数
- 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.
-
-
Partitioner
-
用来将 record 映射到具体的 partition 的方法
-
接口
- numberPartitions
- getPartition
-
-
Aggregator
-
在map侧合并部分record的函数
-
接口
- createCombiner:只有一个 value 的时候初始化的方法
- mergeValue:合并一个 value 到 Aggregator 中
- mergeCombiners:合并两个 Aggregator
-
Shuffle 过程
-
spark中的shuffle变迁过程
-
HashShuffle
- 优点:不需要排序
- 缺点:打开,创建的文件过多
-
SortShuffle
- 优点:打开的文件少、支持map-side combine
- 缺点:需要排序
-
TungstenSortShuffle
- 优点:更快的排序效率,更高的内存利用效率
- 缺点:不支持map-side combine
-
-
Register Shuffle
- 由 action 算子触发 DAG Scheduler 进行 shuffle register
- Shuffle Register 会根据不同的条件决定注册不同的 ShuffleHandle
个人总结
了解了 Shuffle 概述、Shuffle 算子和 Shuffle 过程。