这是我参与「第四届青训营 」笔记创作活动的第8天
大数据 Shuffle 原理与实践
01.Shuffle概述
MapReduce概述:在MapReduce中存在Map、Shuffle、Reduce三个阶段
Map阶段,是在单机上进行的针对一小块数据的计算过程
Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据
为什么shuffle如此重要:数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
02.Shuffle算子
分类:
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
03.Shuffle过程
变迁:
HashShuffle
优点:不需要排序
缺点:打开,创建的文件过多
SortShuffle
优点:打开的文件少、支持map-side combine
缺点:需要排序
TungstenSortShuffle
优点:更快的排序效率,更高的内存利用效率
缺点:不支持map-side combine
Register Shuffle:
由action算子触发DAG Scheduler进行shuffle register
Shuffle Register会根据不同的条件决定注册不同的ShuffleHandle
ShuffleHandle对应三种ShuffleWriter的实现:
BypassMergeSortShuffleWriter:HashShuffle
UnsafeShuffleWriter:TunstonShuffle
SortSHuffleWriter:SortShuffle
ShuffleReader 网络请求流程:
使用netty作为网络框架提供网络服务,并接受reducetask的fetch请求
首先发起openBlocks请求获得streamId,然后再处理stream或者chunk请求
ShuffleBlockFetchIterator:
区分local和remote节省网络消耗
防止OOM
maxBytesInFlight
maxReqsInFlight
maxBlocksInFlightPerAddress
maxReqSizeShuffleToMem
maxAttemptsOnNettyOOM****