本文基本上是大数据处理框架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



















