一 Shuffle机制
运行在不同stage、不同节点上的task如何进行数据传递?这个数据传递过程通常被称为Shuffle机制。 该机制除了数据传递,还负进行各种类型的计算(如聚合、排序等),并且数据量一般会很大。
二 Shuffle面临的一些问题
2.1 map()端数据分区问题
如何确认数据分区个数? 用户可以自定义分区个数。 用户没定义的话,默认分个数是parent RDD的分区个数的最大值。
如何对map()端的输出数据进行分区? map task输出的每个<K,V>记录,都根据Key值计算起partitionId。
2.2 reduce()端数据聚合问题
利用HashMap数据结构实现,并采用在线聚合方式。
2.3 map()端combine问题
本质上,map()端combine问题与reduce()端数据聚合问题是相似的,不同的是,reduce()端聚合的是所有map task输出的数据,而map()端聚合的是来自单一task输出的数据。
2.4 sort问题
在哪里执行? reduce()端必须要执行。 如果map()端进行了排序,可以减少reduce()端排序的复杂度。
执行顺序是怎样的? 先聚合再排序。
2.5 内存不足问题
使用内存+磁盘混合存储方案。 先在内存中执行聚合,当内存不够时,将结果spill到磁盘上,空闲出来的内存可以继续处理新数据。 但spill到磁盘上的数据是部分聚合结果,所以为了得到完整的聚合结果,在下一步数据操作前,对磁盘和内存中的数据再次进行聚合,也称为“全局聚合”。为了加快全局聚合,需要将spill到磁盘上的数据进行排序,这样在全局聚合时,才能够按顺序读取spill到磁盘上的数据,从而减少磁盘I/O。
三 Shuffle框架设计
四 Shuffle中涉及到的一些数据结构
五 Shuffle相关的性能调优
|