Spark中的Shuffle过程

Posted learn-bigdata

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark中的Shuffle过程相关的知识,希望对你有一定的参考价值。

一、Spark中的Shuffle过程

Shuffle分为两种:Shuffle write、Shuffle read

Spark中Shuffle分为两种:HahShuffle、SortShuffle;

1、HashShuffle

磁盘小文件的个数为:M*R = 4*3 =12个

每一个buffer的大小为32k,由于产生的磁盘小文件过多,会产生一系列的问题

如:因为在写文件的时候会产生大量的写句柄,导致产生大量的临时对象,产生OM问题

       在Reduce端读取小文件的时候,又会产生的大量的读句柄,浪费资源

       在Reduce端读取小文件时,因为小文件数目过多,产生大量的通信操作,通信操作会根频繁,浪费资源。

技术图片

针对上述问题,对HashShuffle进行了优化操作

技术图片

此时一个task group共同使用一组block file,这样可以减少大量的磁盘小文件

优化方式中产生磁盘小文件的个数与Executor中Core的个数有关 文件个数 = core*Reduce个数 = 2*3;

2、SortShuffle

SortShuffle分为两种:普通运行机制、ByPass运行机制

(1)普通运行机制

简单说明:

1、一个task产生的数据存储到Map或者Array中(根据使用的算子进行区分),其中内存数据的溢写机制如下:

默认为5M,当数据为5.1m时,此时内存数据会再次申请内存,大小为5.1*2-5 = 5.2m,如果还可以给其分配5.2m的内存,就不溢写,直到最后不能再给其分配资源时,进行溢写。

2、溢写的时会进行排序操作,然后分批写入磁盘文件(默认是batch=1w)

3、在写完成后,会进行文件的合并,并产生一个索引文件,利用快速查找

产生磁盘小文件的个数为:2*m;与Reduce个数无关。

技术图片

(2)ByPass运行机制

减少了排序的环节

产生磁盘小文件的个数为:2*m;与Reduce个数无关。

bypass运行机制的触发:shuffle.reduce.task数量小于spark.shuffle.sort.bypassMergeThreshold参数的值。

技术图片

二、Spark 调优

技术图片

技术图片

技术图片

技术图片

三、Reduce端拉取数据

技术图片

技术图片

 

 

以上是关于Spark中的Shuffle过程的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop与Spark中的Shuffle过程梳理

spark和mapreduce的shuffle

Spark中的Shuffle过程

Hadoop中的Shuffle 与 Spark中的Shuffle得区别与联系

Spark中的Spark Shuffle详解

[spark] shuffle