大数据shuffle原理与实践(1) | 青训营笔记

108 阅读2分钟

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

6.1 shuffle概述

1.MapReduce概述

2004年谷歌发布了《MapReduce:Simplified Data Processing on Large Clusters》论文,在开源实现的MapReduce中,存在Map、Shufle、Reduce三个阶段。

image.png

Map阶段

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

image.png

2.shuffle阶段

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

3.Reduce过程

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

4.为什么shuffle对性能非常重要

1)M * R次网络连接 2)大量的数据移动 3)数据丢失风险 4)可能存在大量的排序操作 5)大量的数据序列化、反序列化操作 6)数据压缩

image.png

5.总结

image.png

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

6.2 shuffle算子

1.shuffle算子分类

spark中会产生shuffle的算子大概可以分为四类:

image.png

shuffle算子应用

1)spark源码中RDD的单元测试

2)spark源码中PairRDDFunctions的单元测试

image.png

2.spark中对shuffle的抽象——宽依赖、窄依赖

1)窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖

2)宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖

image.png

算子内部的依赖关系

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

image.png

image.png

Shuffle Dependency 构造-Aggregator

createCombiner:只有一个value 的时候初始化的方法

mergeValue:合并一个 value到Aggregator中

mergeCombiners:合并两个Aggregator