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

126 阅读3分钟

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

一、Shuffle概述

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

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

二、Shuffle算子

spark中会导致shuffle操作的有以下几种算子

1、repartition类的操作:比如repartition、repartitionAndSortWithinPartitions、coalesce等

2、byKey类的操作:比如reduceByKey、groupByKey、sortByKey等

3、join类的操作:比如join、cogroup等

重分区: 一般会shuffle,因为需要在整个集群中,对之前所有的分区的数据进行随机,均匀的打乱,然后把数据放入下游新的指定数量的分区内

byKey类的操作:因为你要对一个key,进行聚合操作,那么肯定要保证集群中,所有节点上的,相同的key,一定是到同一个节点上进行处理

join类的操作:两个rdd进行join,就必须将相同join key的数据,shuffle到同一个节点上,然后进行相同key的两个rdd数据的笛卡尔乘积

三、Shuffle过程

洗牌

Map阶段处理的数据如何传递给reduce阶段,shuffle在其中起到了很关键的作用,shuffle分布在MapReduce的map阶段和reduce阶段。

Map的shuffle过程:主要包括输出、排序、溢写、合并等步骤:

1、collect:每个Maptask都将数据输出到该Maptask对应的环形缓冲区Kvbuffer中,使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据。

2、Sort:在对数据进行合并的同时,会进行排序操作,由于 MapTask 阶段已经对 数据进行了局部的排序,ReduceTask 只需保证 Copy 的数据的最终整体有效性即可。

3、Spill:当内存中的数据量达到了一定的阀值的时候,会生成一个溢写文件,将环形缓冲区中的原始数据写入该文件,按照上一步排序的元数据,溢写时对原始数据进行排序。

由于一个Maptask处理的数据可能需要多次溢写才能写完,所以每个Maptask可能生成多个溢写文件。最终剩在环形缓冲区中的数据达不到阈值条件,会强制刷出生成一个溢写文件。

4、Merge:在 ReduceTask 远程复制数据的同时,会在后台开启两个线程对内存到 本地的数据文件进行合并操作。

5、Copy:Reduce 任务通过HTTP向各个Map任务拖取它所需要的数据。每个节点都会启动一个常驻的HTTP server,其中一项服务就是响应Reduce拖取Map数据。当有MapOutput的HTTP请求过来的时候,HTTP server就读取相应的Map输出文件中对应这个Reduce部分的数据通过网络流输出给Reduce。

6、排序合并sort-merge:每个分区的数据从多个maptask拖取过来后进行归并排序,合并成一个文件,最后各个分区的文件通过分区组件的逻辑,划分到不同的reducetask。