这是我参与「第四届青训营 」笔记创作活动的第5天。
课程内容及分析理解
一、课程内容
1.Shuffle概述
2.Shuffle算子
3.Shuffle过程
二、分析理解
(一)Shuffle概述
-
Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。
-
在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。Spark也会有自己的shuffle实现过程。
(二)Shuffle算子
1.算子种类
- Spark中会产生的算子大概有以下四种:聚合、排序、重分区和去重。
2.Shuffle抽象
-
Spark中对Shuffle的抽象有分为宽依赖和窄依赖。
-
窄依赖:父RDD的每个分片之多被子RDD中的一个分片所依赖。
-
宽依赖:父RDD的分片可能被子RDD中的多个分片所依赖。
-
总结:在内存足够的前提下,减少使用有shuffle的算子,会提高代码运行效率。
(三)Shuffle过程
1.Shuffle过程简介
-
Map输出的键值对都写入缓存。缓存每次满时,触发溢写过程。溢写把处理后键值对写到硬盘文件中。一次溢写生产一个文件。每次溢写完成后清空缓存。
-
溢写包括分区、排序、合并(可能发生合并)。
-
每个Reduce任务获取本任务需要处理的由Map任务产生的溢写文件,多个溢写文件最终归并为1个文件,然后Reduce任务对该文件安装用户编程逻辑处理,输出最终键值对,再由OutputFormat把键值对写入HDFS中。
2.Map端的Shuffle过程(排序和合并不改变分区数量,就是Reduce任务数量)
-
每个Map任务分配一个缓存,用于存放Map输出的中间结果键值对;MapReduce中该缓存默认100MB。
-
设置溢写比例0.8。即缓存被占满80%时,启动溢写进程,把缓存中数据溢写到HDFS文件中。剩余20%用于溢写过程中存放Map输出的键值对,避免Map输出的键值对丢失。这样溢写不会影响Map的正常运行。
-
分区:Map输出的键值对由不同的Reduce任务处理。所以要将Map输出的键值对按照Reduce任务数量分区,以供对应的Reduce任务取走再做进一步处理。\
-
**分区默认采用哈希函数 (使用key作为哈希函数输入,由哈希函数输出的值作为键值对的存储地址)。
3.Reduce端的Shuffle过程
-
Reduce任务通过RPC向JobTracker询问Map任务是否已经完成,若完成,则领取数据。
-
Reduce领取数据先放入缓存,来自不同Map机器,先归并,再合并,写入磁盘。
-
多个溢写文件归并成一个或多个大文件,文件中的键值对是排序的。
-
当数据很少时,不需要溢写到磁盘,直接在缓存中归并,然后输出给Reduce。
参考文献: Shuffle过程详解 www.cnblogs.com/ostin/artic… 大数据Shuffle原理与实践 bytedance.feishu.cn/file/boxcnQ…