大数据 Shuffle 原理与实践 | 青训营笔记

101 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第8天

大数据 Shuffle 原理与实践

01.Shuffle概述

MapReduce概述:在MapReduce中存在Map、Shuffle、Reduce三个阶段

image.png

Map阶段,是在单机上进行的针对一小块数据的计算过程

Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备

Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据

为什么shuffle如此重要:数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。

02.Shuffle算子

分类:

image.png

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请求

image.png

ShuffleBlockFetchIterator:

区分local和remote节省网络消耗

防止OOM

maxBytesInFlight

maxReqsInFlight

maxBlocksInFlightPerAddress

maxReqSizeShuffleToMem

maxAttemptsOnNettyOOM****