Spark Tungsten-sort Based Shuffle 分析

  另外写文件的时候也需要一个 buffer :

  spark.shuffle.file.buffer = 32k

  另外从内存里拿到数据放到DiskWriter,这中间还要有个中转,是通过

  final byte[] writeBuffer = new byte[DISK_WRITE_BUFFER_SIZE=1024 * 1024];

  来完成的,都是内存,所以很快。

  Task结束前,我们要做一次mergeSpills操作,然后形成一个shuffle 文件。这里面其实也挺复杂的,

  如果开启了

  `spark.shuffle.unsafe.fastMergeEnabled=true`

  并且没有开启

  `spark.shuffle.compress=true`

  或者压缩方式为:

  LZFCompressionCodec

  则可以非常高效的进行合并,叫做transferTo。不过无论是什么合并,都不需要进行反序列化。

  Shuffle Read

  Shuffle Read 完全复用HashShuffleReader,具体参看 Sort-Based Shuffle。

  总结

 

  我个人感觉,Tungsten-sort 实现了内存的自主管理,管理方式模拟了操作系统的方式,通过Page可以使得大量的record被顺序存储在内存,整个shuffle write 排序的过程只需要对指针进行运算(二进制排序),并且无需反序列化,整个过程非常高效,对于减少GC,提高内存访问效率,提高CPU使用效率确实带来了明显的提升。