一、概述

ShuffleWriter 负责将 Map 任务的输出,写出到 Shuffle 系统的文件中。在基于排序的 Shuffle 框架中,ShuffleWriter 会合并文件,它为每个 Map Task生成一个数据文件和一个索引文件。

二、实现

抽象类 ShuffleWriter 定义了将 map 任务的中间结果输出到磁盘上的功能规范,包括将数据写入磁盘和关闭 ShuffleWriter。

ShuffleWriter 定义的 $write()$ 方法用于将 map 任务的结果写到磁盘,而 $stop()$ 方法可以关闭 ShuffleWriter。ShuffleWriter一共有三个子类,分别为SortShuffleWriter、UnsafeShuffleWriter 及 BypassMergeSortShuffleWriter。

https://weread.qq.com/web/reader/0c832fb05e12e40c8ca6190k2a3327002582a38a4a932bf

2.1. SortShuffleWriter

SortShuffleWriter 是 ShuffleWriter 的实现类之一,提供了对 Shuffle 数据的排序功能。SortShuffleWriter 使用 ExternalSorter 作为排序器,由于ExternalSorter 底层使用了 PartitionedAppendOnlyMap 和 PartitionedPairBuffer 两种缓存,因此 SortShuffleWriter 还支持对 Shuffle 数据的聚合功能。

2.2. BypassMergeSortShuffleWriter

BypassMergeSortShuffleWriter 适用于 map 端不需要在持久化数据之前进行聚合、排序等操作的场景。

2.3. UnsafeShuffleWriter

UnsafeShuffleWriter 底层使用 ShuffleExternalSorte 作为外部排序器,所以 UnsafeShuffleWriter 不具备 SortShuffleWriter 的聚合功能。UnsafeShuffleWriter 将使用 Tungsten 的内存作为缓存,以提高写入磁盘的性能。