这是我参与「第四届青训营 」笔记创作活动的的第五天
一、本堂课重点内容:
- shuffle概述、shuffle的基本过程
- spark中的shuffle算子及其基本特性
- spark中的shuffle过程
二、详细知识点介绍:
shuffle算子及其基本特性
常见的触发shuffle的算子
算子会产生shuffle是因为数据要产生移动
-
repartition(改变分区)
- coalesce、repartition
-
ByKey(聚合kv对)
- groupByKey、reduceByKey、aggregateByKey、combineByKey、sortByKeysortBy
-
Join
- cogroup、join
-
distinct
算子内部的依赖关系
创建会产生shuffle的RDD时,RDD会创建Shuffle Dependency来描述Shuffle相关的信息
Shuffle Dependency构造时重要的两个对象
Shuffle Dependency是spark中对shuffle的一个抽象,这个对象的构造函数中包含若干变量 ,Partitioner和Aggregator是最重要的两个对象。
-
Partitioner(抽象类),经典实现:HashPartitioner
-
用来将record映射到具体的partition的方法
-
接口
- numberPartitions
- getPartition
-
-
Aggregator
-
在map侧合并部分record的函数
-
接口
- createCombiner:只有一个value的时候初始化的方法
- mergeValue:合并一个value到Aggregator中
- mergeCombiners:合并两个Aggregator
-
spark中的shuffle过程
-
Register Shuffle
- 由action算子触发DAG Scheduler进行shuffle register
- Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle
- BypassMergeSortShuffleWriter:HashShuffle不需要map()端聚合和排序。
根据partitiId将record依次输出到不同的buffer中,填满后spill到磁盘的分区文件中。
缺点:资源消耗过高,每个分区都需要一个buffer且同时需要建立多个分区文件来spill,适合分区数较小的情况。
- UnsafeShuffleWriter:TunstonShuffle 不需要map()端聚合但需要排序。 建立一个Array将<K,V>record转化为<(PID,K),V>,根据partitionId+Key进行排序,最后将record写入一个文件中,通过建立索引来标示每个分区。
Array大小可控且可以扩容和spill到磁盘的功能。
- SortSHuffleWriter:SortShuffle需要map()端聚合,需要or不需要按照Key排序 建立一个类似HashMao+Array的数据结构(PartitionedAppendOnlyMap) HashMap中的Key是“partitionId+Key”,value是经过相同combine的聚合结果。
三、引用参考&推荐书目
- juejin.cn/post/712390…
- 《大数据处理框架 Apache Spark设计与实现》