本文基本上是大数据处理框架Apache Spark设计与实现的Shuffle部分的学习。以及Spark基础知识@Bambrow
Shuffle解决啥问题
上游和下游,不同stage,不同的task之间是如何传递数据的。ShuffleManager管理ShuffleWrite和ShuffleRead
分为两个阶段:
ShuffleWrite
上游stage输出的分区问题。
ShuffleRead
下游stage从上游获取数据,组织数据的问题
涉及到三个操作:
分区
分区是为了让reduce task可以获取相应的数据。
排序
有些算子需要进行排序。比如sortBy().可以在Shuffle机制中,完成排序。
聚合
相同key的结构放到一起,进行计算。
Map端聚合,可以减少Shuffle网络传输。
Shuffle框架的设计和实现
ShuffleWrite
HashShuffleManager(Spark2.0移除):
哈希的方式决定Map端分区文件写入,临时文件命名为shuffle_“+shuffleId+”“+mapId+”"+reduceId,文件公用,追加写入。
缺点在于:
1,临时文件过多(R*C),随机写性能差。
2.写缓冲内存过大。
consolidate 机制可以重用文件,减少临时文件数。
它主要关注的点在于Map端的分区,聚合。
SortShuffleManager
分区,MapTask写缓冲区,Partition内不排序(MR对内按照Key进行排序),溢写文件。完成之后,使用ExternalSorter对临时文件进行排序,合并成一个大文件和索引文件。
数据结构
ShuffleRead
跨节点获取数据,聚合和排序。
谁启动ReadTask,启动多少个线程?
和Hadoop的对比
Shuffle write 排序
Shuffle write 文件数目
Shuffle read 多线程拷贝
read聚合排序 MR归并(已经分区内部有序了),哈希归并(按key哈希)
参考文档
spark源码之shuffleManager