大数据Shuffle原理与实践 | 字节青训营

252 阅读2分钟

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

课程内容

01.Shuffle 概述

02.Shuffle 算子

03.Shuffle 过程

04.Push Shuffle

01.Shuffle 概述

MapReduce

map阶段:主要是实现数据分类 image.gif Shuffle节点:主要实现数据的移动与整合

image (2).gif reduce阶段:对不同种类的数据分别进行统计处理

image (1).gif

image.jpeg

MapReduce把数据处理带到了一个新的阶段--大数据处理。

Shuffle对性能很重要的原因:

image.png

02.Shuffle 算子

分类: image.png 应用:

Spark源码中RDD的单元测试: spark/RDDSuite.scala at master · apache/spark (github.com)

Spark源码中PairRDDFunctions的单元测试: spark/PairRDDFunctionsSuite.scala at master · apache/spark (github.com)

宽依赖和窄依赖是Spark中对Shuffle的抽象

image.png 算子内部的依赖: image.png Shuffle Dependency 构造 image.png 重要的两个部分:

1)Partitioner

image.png 2)Aggregator

image.png

03.Shuffle 过程

写数据-Hash Shuffle

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

image (1).png

Hash Shuffle 的优化

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

image (2).png

Sort shuffle-写数据

每个task只生成一个包含所有partition数据的文件和一个index file(记录每个partition在数据文件中的偏移),优于 Hash shuffle(hash shuffle只适合在数据少的时候使用)。

image (3).png

读数据时,Hash Shuffle和Sort Shuffle性能一样。

image.png

Shuffle 过程的触发流程

image.png

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

Shuffle Handle对应了Shuffle的实现方式,一共有三种。

image (1).jpeg 不同的Shuffle Handle 对应不同的Shuffle Writer:

image (2).jpeg

Writer的实现

1)BypassMergeSortShuffle Writer

适用于partition数量较少的情况(partition数量小于200)

image.png 2)UnsafeShuffleWriter

当Partition数量较多的时候,需要排序了;

使用堆外内存,数据通过序列化写入堆外内存;数据写入后不再反序列化。

image.png

UnsafeShuffleWriter 对于堆外内存的管理。

image.png

3)SortShuffleWriter

image.png

Reader的实现

网络时序图

image (4).png image.png

image.png

Shuffle优化使用的技术-Zero Copy

image.png

image.png shuffle倾斜的问题: 某一类数据很多,导致端到端的处理时间延长(多类数据共同处理)

image.png

常见的shuffle倾斜处理方法:

  1. 提高并行度

image.png 2. Spark AQE Skew Join Spark 3.0 发布的shuffle实现方法

image.png

04.Push Shuffle

目前业界最新的一个shuffle的实现方法

image.png

image.png

image.png

image.png

image.png

image.png

image.png