这是我参与「第四届青训营 」笔记创作活动的第4天,笔记内容围绕「大数据 Shuffle原理与实践」课程展开,主要介绍Shuffle概述、Shuffle算子和Shuffle过程。
1.Shuffle概述
1.1 MapReduce概述
- 2004年谷歌发布了《MapReduce:Simplified Data Processing on LargeClusters》论文
- 在开源实现的MapReduce中,存在Map、Shuffle、Reduce三个阶段。
1.2 Shuffle阶段
- Shuffle阶段,在map阶段的基础上,进行数据移动,为后续的reduce阶段做准备.
1.3 Reduce过程
- Reduce阶段,对移动后的数据进行处理,依然是在单机上处理一小份数据.
1.4为什么shuffle 对性能非常重要
- M * R次网络连接
- 大量的数据移动
- 数据丢失风险
- 可能存在大量的排序操作
- 大量的数据序列化、反序列化操作数据压缩
Shuffle描述着数据从map task输出到reduce task输入的这段过程。shuffle是连接Map和Reduce之间的桥梁,Map的输出要用到Reduce中必须经过shuffle这个环节,shuffle的性能高低直接影响了整个程序的性能和吞吐量。因为在分布式情况下,reduce task需要跨节点去拉取其它节点上的map task结果。这一过程将会产生网络资源消耗和内存,磁盘IO的消耗。通常shuffle分为两部分:Map阶段的数据准备和Reduce阶段的数据拷贝处理。一般将在map端的Shuffle称之为Shuffle Write,在Reduce端的Shuffle称之为Shuffle Read.
在大数据场景下,数据shuffie表示了不同分区数据交换的过程,不同的shuffle策略性能差异较大。目前在各个引擎中shuffle都是优化的重点,在spark框架中,shuffle是支撑spark进行大规模复杂数据处理的基石。
Shuffle算子
2.1 Shuffle算子分类
Spark中会产生shuffle的算子大概可以分为4类
2.2 Spark中对shuffle的抽象–宽依赖、窄依赖
- 窄依赖:父RDD的每个分片至多被子RDD中的一个分片所依赖
- 宽依赖:父RDD中的分片可能被子RDD中的多个分片所依赖
3.Shuffle过程
Shuffle实现的发展历程
- Spark 0.8及以前Hash Based Shuffle
- Spark 0.8.1为Hash Based Shuffle引入File Consolidation机制
- Spark 0.9 引入ExternalAppendOnlyMap
- Spark 1.1引入Sort Based Shuffle,但默认仍为Hash Based Shuffle
- Spark 1.2默认的Shuffle方式改为Sort Based Shuffle
- Spark 1.4引入Tungsten-Sort Based Shuffle
- Spark 1.6 Tungsten-Sort Based Shuffle并入Sort Based Shuffle.
- Spark 2.0 Hash Based Shuffle退出历史舞台
3.1 Hash Shuffle
- 写数据
每个partition会映射到一个独立的文件
- 写数据优化
每个partition会映射到一个文件片段
3.2 Sort shuffle
- 写数据 每个task生成一个包含所有partiton数据的文件
3.3 Shuffle-读数据
每个reduce task分别获取所有map task生成的属于自己的片段