首页 理论教育 教程分享:排序Shuffle的编写过程

教程分享:排序Shuffle的编写过程

时间:2023-06-21 理论教育 版权反馈
【摘要】:排序Shuffle与哈希Shuffle最大的区别在于,每个map端最多只会输出两个文件,其中一个是数据文件,用于存储即将送往reduce端的数据;另一个是索引文件,用于说明不应该发送往reducer的数据在数据文件中的偏移量。排序Shuffle的实现远比哈希Shuffle要复杂,在此仅简单介绍其流程。

教程分享:排序Shuffle的编写过程

排序Shuffle与哈希Shuffle最大的区别在于,每个map端最多只会输出两个文件,其中一个是数据文件,用于存储即将送往reduce端的数据;另一个是索引文件,用于说明不应该发送往reducer的数据在数据文件中的偏移量。为了生成相应的数据和索引文件,需要保证map端输出的数据,至少是分区有序的,也就是按照reducer分区编号排好顺序。

排序Shuffle的实现远比哈希Shuffle要复杂,在此仅简单介绍其流程。SortShuffleWriter.write的实现代码如下。

SortShuffleWriter使用ExternalSorter来辅助其完成聚合、计算以及排序的工作。需要注意的是,无论ShuffleDependency是否指定了combiner,ExternalSorter输出的结果都能保证按照reducer分区编号排序,而如果指定了keyOrdering用于分区内部键值的排序,只有同时指定了combiner才会有意义,否则这个分区内部键值排序过程会留到Shuffle读过程来执行。

ExternalSorter内部会根据是否要求Combine操作以及分区的个数,来决定数据的存储结构。可以分成三种情况,一种是使用PartitionedAppendOnlyMap哈希表结构,用于需要进行聚合的情况,另一种是使用PartitionedPairBuffer/PartitionedSerializedPairBuffer(根据是否需要序列化决定)缓冲区结构,用于分区数量比较多(大于spark.shuffle.sort.bypassMergeThreshold设置的阈值),且不需要聚合的时候;而最后一种当分区数量比较少的时候,则直接把数据按照分区写入到不同文件中。

对于哈希表和缓冲区两种情况,每添加一个数据,都会检查是否大于某阈值。如果大于,则尝试申请更多内存,扩大阈值。如果仍然大于阈值。则调用ExternalSorter.spillToMergeableFile函数将其溢存。溢存前的数据会按照指定的分区编号以及keyOrdering(如果指定的话)对内存中的数据进行排序,然后写入到文件中。

当所有的数据插入ExternalSorter后,会执行一次外部排序过程来对数据进行排序,排序过程会将内存中的数据以及溢存文件中的数据最终合并成一个内部数据按分区和按keyOrdering(如果指定的话)排序的文件。(www.xing528.com)

SortShuffleWriter使用ExternalSorter来辅助其完成聚合、计算以及排序的工作。需要注意的是,无论ShuffleDependency是否指定了combiner,ExternalSorter输出的结果都能保证按照reducer分区编号排序,而如果指定了keyOrdering用于分区内部键值的排序,只有同时指定了combiner才会有意义,否则这个分区内部键值排序过程会留到Shuffle读过程来执行。

ExternalSorter内部会根据是否要求Combine操作以及分区的个数,来决定数据的存储结构。可以分成三种情况,一种是使用PartitionedAppendOnlyMap哈希表结构,用于需要进行聚合的情况,另一种是使用PartitionedPairBuffer/PartitionedSerializedPairBuffer(根据是否需要序列化决定)缓冲区结构,用于分区数量比较多(大于spark.shuffle.sort.bypassMergeThreshold设置的阈值),且不需要聚合的时候;而最后一种当分区数量比较少的时候,则直接把数据按照分区写入到不同文件中。

对于哈希表和缓冲区两种情况,每添加一个数据,都会检查是否大于某阈值。如果大于,则尝试申请更多内存,扩大阈值。如果仍然大于阈值。则调用ExternalSorter.spillToMergeableFile函数将其溢存。溢存前的数据会按照指定的分区编号以及keyOrdering(如果指定的话)对内存中的数据进行排序,然后写入到文件中。

当所有的数据插入ExternalSorter后,会执行一次外部排序过程来对数据进行排序,排序过程会将内存中的数据以及溢存文件中的数据最终合并成一个内部数据按分区和按keyOrdering(如果指定的话)排序的文件。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈