概述

这篇文章是Spark Shuffle之Sort Shuffle的一部分,介绍SortShuffleWriter的实现,也就是Sort Shuffle。

SortShuffleWriter

SortShuffleWriter的逻辑在write方法,查看代码
Spark Shuffle之SortShuffleWriter
可以看出SortShuffleWriter使用ExternalSorter处理map端输出,因此,接下来的分析围绕ExternalSorter展开,在Spark Shuffle之Hash Shuffle这篇文章中简单讨论过reduce端使用ExternalSorter实现排序的原理。

ExternalSorter实现

存储

ExternalSorter内部维护了两个集合PartitionedAppendOnlyMapPartitionedPairBuffer
Spark Shuffle之SortShuffleWriter
两者底层均使用数组,完全一致,如下
Spark Shuffle之SortShuffleWriter
每条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,如下
Spark Shuffle之SortShuffleWriter

排序

使用TimSort对PartitionedAppendOnlyMapPartitionedPairBuffer底层的Array进行排序,
Spark Shuffle之SortShuffleWriter

排序的逻辑是,先根据PartitionId,再根据K的hashCode进行排序。上图中的keyComparator如下
Spark Shuffle之SortShuffleWriter

上图先判断PartitionId,再调用keyComparator比较K,keyComparator如下
Spark Shuffle之SortShuffleWriter
上图中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 ShuffleSpark Shuffle之Sort ShuffleSpark Shuffle之Tungsten-Sort相关部分,不再累述。

总结

介绍ExternalSorter的实现原理,SortShuffleWriter使用其存储数据及进行排序。

相关文章: