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

108 阅读3分钟

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

课程内容及分析理解

一、课程内容

1.Shuffle概述

2.Shuffle算子

3.Shuffle过程

二、分析理解

(一)Shuffle概述

  • Shuffle就是对数据进行重组,由于分布式计算的特性和要求,在实现细节上更加繁琐和复杂。

  • 在MapReduce框架,Shuffle是连接Map和Reduce之间的桥梁,Map阶段通过shuffle读取数据并输出到对应的Reduce;而Reduce阶段负责从Map端拉取数据并进行计算。在整个shuffle过程中,往往伴随着大量的磁盘和网络I/O。所以shuffle性能的高低也直接决定了整个程序的性能高低。Spark也会有自己的shuffle实现过程。

微信图片_20220731144332.png

(二)Shuffle算子

1.算子种类

  • Spark中会产生的算子大概有以下四种:聚合、排序、重分区和去重。

微信图片_20220731144740.png

2.Shuffle抽象

  • Spark中对Shuffle的抽象有分为宽依赖窄依赖

  • 窄依赖:父RDD的每个分片之多被子RDD中的一个分片所依赖。

  • 宽依赖:父RDD的分片可能被子RDD中的多个分片所依赖。

  • 总结:在内存足够的前提下,减少使用有shuffle的算子,会提高代码运行效率。

(三)Shuffle过程

1.Shuffle过程简介

  • Map输出的键值对都写入缓存。缓存每次满时,触发溢写过程。溢写把处理后键值对写到硬盘文件中。一次溢写生产一个文件。每次溢写完成后清空缓存。

  • 溢写包括分区、排序、合并(可能发生合并)。

  • 每个Reduce任务获取本任务需要处理的由Map任务产生的溢写文件,多个溢写文件最终归并为1个文件,然后Reduce任务对该文件安装用户编程逻辑处理,输出最终键值对,再由OutputFormat把键值对写入HDFS中。

微信图片_20220731145410.jpg

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…