文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州
▲ 本章节目的
⚪ 了解Spark的定义&&特点&&目的&&优缺点;
⚪掌握Spark的相关参数配置;
⚪掌握Hadoop的插件配置;
一、Spark Shuffle详解
1. 概述
Shuffle,就是洗牌。之所以需要Shuffle,还是因为具有某种共同特征的一类数据需要最终汇聚(aggregate)到一个计算节点上进行计算。这些数据分布在各个存储节点上并且由不同节点的计算单元处理。
以最简单的Word Count为例,其中数据保存在Node1、Node2和Node3。
经过处理后,这些数据最终会汇聚到Nodea、Nodeb处理,如下图所示:
这个数据重新打乱然后汇聚到不同节点的过程就是Shuffle。但是实际上,Shuffle过程可能会非常复杂:
1. 数据量会很大,比如单位为TB或PB的数据分散到几百甚至数千、数万台机器上。
2. 为了将这个数据汇聚到正确的节点,需要将这些数据放入正确的Partition,因为数据大小经常大于节点的内存,因此这个过程中可能会发生多次硬盘续写。
3. 为了节省带宽,这个数据可能需要压缩,如何在压缩率和压缩解压时间中间做一个比较好的选择?
4. 数据需要通过网络传输,因此数据的序列化和反序列化也变得相对复杂。
一般来说,每个Task处理的数据可以完全载入内存(如果不能,可以减小每个Partition的大小),因此Task可以做到在内存中计算。但是对于Shuffle来说,如果不持久化这个中间结果,一旦数据丢失,就需要重新计算依赖的全部RDD。因此有必要持久化这个中间结果。所以这就是为什么Shuffle过程会产生文件的原因。
如果Shuffle过程不落地,①可能会造成内存溢出,②当某分区丢失时,会重新计算所有父分区数据。
2. Shuffle Write
Shuffle Write,即数据时如何持久化到文件中,以使得下游的Task可以获取到其需要处理的数据的(即 Shuffle Read)。在Spark 0.8之前,Shuffle Write是持久化到缓存的,但后来发现实际应用中&#x