这是我参与「第四届青训营」笔记创作活动的的第6天
一、Shuffle概述
1.1 MapReduce 概述
- 2004年谷歌发布了《MapReduce:Simplified Data Processing on Large Clusters》论文
- 在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
- map阶段,是在单机上进行的针对一小块数据的计算过程
- shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备
- Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据
1.2为什么shuffle对性能非常重要
- M士R次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化操作
- 数据压缩
在大数据场景下,数据shuffle表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。 目前在各个引擎中shuffle 都是优化的重点,在spark框架中,shuffle 是支撑spark进行大规模复杂 数据处理的基石。
二、Shuffle算子
- Shuffle算子分类
- Shuffle算子应用
- Spark中对shuffle的抽象-宽依赖、窄依赖
窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
- 算子内部的依赖关系
- shuffle dependency构造
- shuffle dependency构造-partitioner
- shuffle dependency构造-aggregator
三、 shuffle优化使用的技术栈:Netty Zero Copy
-
可堆外内存,避免JVM堆内存到堆外内存的数据拷贝。
-
CompositeByteBuf 、Unpooled.wrappedBuffer. ByteBuf.slice ,可以合并、包装、切分数组,避 免发生内存拷贝。
-
Netty使用FileRegion实现文件传输, FileRegion底层封装了FileChannel#transferTo0方法,可以 将文件缓冲区的数据直接传输到目标Channel,避免内核缓冲区和用户态缓冲区之间的数据拷贝。