目录
1.2 Shuffle分为shuffle和sortShuffle
1. shuffle详解
之前说RDD宽窄依赖,划分stage时说到一个RDD是否有多个子RDD判断其是窄依赖还是宽依赖,这其中宽依赖:一个RDD有多个子RDD,这个过程中有shuffle过程;
Stage中pipeline计算模型时提到数据什么时候落地:shuffle或者checkpoint
1.1 那么到底什么时shufffle?
我们之前说到reduceByKey会有shuffle过程,那我们从reduceByKey为例开始
reduceByKey的含义?
reduceByKey会将一个RDD中的每一个key对应的所有value聚合成一个value,然后生成一个新的RDD,元素类型是<key, value>的形式,这样每一个key对应一个聚合起来的value
问题:
每一个key对应的value不一定都在一个partition中,也不太可能在同一个节点上,因为RDD是分布式的弹性的数据集,他的partition很可能分布在各个节点上
如何聚合?
- Shuffle Write:上一个stage的每个map task就必须保证将自己处理的当前分区中的数据相同的key写入一个分区文件中,可能会写入多个不同的分区文件
- Shuffle Read:reduce task就会从上一个stage的所有task所在的机器上寻找属于自己的那些分区文件,这样就可以保证每一个key多对应的value都会汇聚到同一个节点上去处理和聚合
1.2 Shuffle分为shuffle和sortShuffle
1.2.1 shuffle普通机制
shuffle 普通机制运行原理图
一个executor中的每个task都有属于自己的buffer缓冲区
执行流程
- Map task 处理完数据后,将结果写入到buffer缓冲区(与reduce task数量一致),每个buffer默认32k
- 满了之后溢写到磁盘,每个buffer对应一个磁盘小文件。
- Reduce task到不同的节点去拉取数据自己的数据
产生的小文件的个数:M(map task) * R(reduce task )
问题:
产生磁盘小文件太多
<