1、ShuffleManager管理接口
在spark2.x版本中ShuffleManager的实现类只剩下SortShuffleManager。
2、SortShuffleManager实现类
接下来,看看shuffle注册器的实现:
红框中标出的是Shuffle处理器。
找到顶级的ShuffleHandle抽象类:
直接的实现类则为BaseShuffleHandle:
BaseShuffleHandle有两个子类:SerializedShuffleHandle 和 BypassMergeSortShuffleHandle;
可以看出这些Handle类中没有任何方法,只作为一个类型标注。实际相关的shuffle实现,是通过getReader和getWriter时在reader、writer实现。
getReader方法:构造了BlockStoreShuffleReader类对象
getWriter方法:根据ShuffleHandle的不同返回不同的Writer。
接下来看看其他方法:
unregisterShuffle:注销shuffle方法,会移除shuffleId记录和对应的数据文件
stop方法:无多大意义,调用IndexShuffleBlockResolver的stop方法,IndexShuffleBlockResolver的stop方法为空方法。
3、registerShuffle的调用
Dependency实际是在RDD中生成,不同的RDD算子,会构造不同的RDD。
RDD中map方法:
RDD的依赖获取:
ShuffledRDD的依赖获取:
ShuffleDependency的构建则会触发ShuffleHandle的注册:
从上图红框可以看出,Rdd依赖生成过程中,会注册ShuffleHanle,numMaps默认采用分区数。