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

62 阅读2分钟

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

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

1. Shuffle概述

1.1 MapReduce概述

image.png

1)Map阶段,是在单机上针对一小部分数据的计算过程

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

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

1.2 shuffle对性能很重要

M*R次网络连接

大量的数据移动

数据丢失风险

可能存在大量的排序操作

大量的数据序列化、反序列化操作

数据压缩

2. Shuffle算子

2.1 Shuffle分类

image.png

1) repartition:改变分区的过程

2)ByKey:把相同的Key聚合到一次的操作(比如把相同类型的数据聚合在一次的过程)

3) join:把本身没有联系的数据按某种条件连接到一次的过程

4)Distinct:特殊的bykey操作

2.2 Shuffle Dependency 构造

shuffle Dependency是Shuffle算子的抽象实现

3. Shuffle过程

3.1 Hash Shuffle-写数据

每个partition会映射到一个独立的文件

image.png

3.2 Hash Shuffle-写数据优化

每个partition会映射到一个文件片段

image.png

3.3 sort shuffle :写数据

每个task生成一个包含所有partition数据的文件

image.png

3.4 shuffle读数据

每个reduce task分别获取所有map task生成的属于自己的片段

image.png

3.5 shuffle触发过程

CollectAction

SubmitJob

GetDependencies

RegisterShuffle

3.6 Shuffle Handle 的创建

Register Shuffle时做的最重要的事情是根据不同条件创建不同的shuffle Handle

image.png

3.7 Shuffle Handle与Shuffle writer的关系

image.png

  1. BypassMergeSortShuffleWriter
  • 不需要排序,节省时间
  • 写操作的时候会打开大量文件
  • 类似与hash shuffle

image.png

2)UnsafeShuffleWriter

  • 使用类似内存页存储序列化数据
  • 数据写入后不再反序列化

image.png