概述
这篇文章是Spark Shuffle之Sort Shuffle的一部分,介绍SortShuffleWriter的实现,也就是Sort Shuffle。
SortShuffleWriter
SortShuffleWriter的逻辑在write方法,查看代码
可以看出SortShuffleWriter使用ExternalSorter处理map端输出,因此,接下来的分析围绕ExternalSorter展开,在Spark Shuffle之Hash Shuffle这篇文章中简单讨论过reduce端使用ExternalSorter实现排序的原理。
ExternalSorter实现
存储
ExternalSorter内部维护了两个集合PartitionedAppendOnlyMap、PartitionedPairBuffer
两者底层均使用数组,完全一致,如下
每条K-V Pair记录占两个位置,2i位置存储的是元组,内容为PartitionId + K,2i + 1存储V,两者的区别在于功能上
| 是否支持aggregation | 实现 | |
| PartitionedAppendOnlyMap | 支持 | 基于Array实现的HashMap结构,支持lookup,并在此基础上实现aggregation,使用线性探查法处理Hash冲突 |
| PartitionedPairBuffer | 不支持 | 就是Array结构,K-V Pair依次写入数组中,因此不支持aggregation操作 |
SortShuffleWriter会根据是否有aggregation操作,灵活选择PartitionedAppendOnlyMap或PartitionedPairBuffer,如下
排序
使用TimSort对PartitionedAppendOnlyMap、PartitionedPairBuffer底层的Array进行排序,
排序的逻辑是,先根据PartitionId,再根据K的hashCode进行排序。上图中的keyComparator如下
上图先判断PartitionId,再调用keyComparator比较K,keyComparator如下
上图中keyComparator比较的是K的hashCode。
这么处理后Partition内K是有序的,顺序由K的hashCode决定,但是和Mapreduce实现不同,这个Partition内的顺序并不会被reduce端直接使用,reduce端不会进行merge-sort,而是当做无序进行处理,更多信息请参考Add MR-style (merge-sort) SortShuffleReader for sort-based shuffle。
其他
其他如map端聚合、reduce端聚合、reduce端sort、溢写、写文件等,参考Spark Shuffle之Hash Shuffle、Spark Shuffle之Sort Shuffle、Spark Shuffle之Tungsten-Sort相关部分,不再累述。
总结
介绍ExternalSorter的实现原理,SortShuffleWriter使用其存储数据及进行排序。