其余更多java基础文章:
java基础学习(目录)html
这部分能力有限,因此推荐一些大神文章阅读学习:java
Apache Spark Shuffle 过程:这篇文章能够做为入门学习文章,主要讲了Spark Shuffle和MapReduce Shuffle的对比、Shuffle Write和Shuffle Read的概念和原理、典型 transformation() 算子的 shuffle read原理、Shuffle read 中的 HashMap模型
因为文章编写的比较旧了,因此是HashSHuffle原理的文章。可是仍然是很是好的一篇原理讲解文章。了解了hashShuffle才能更好的了解后面的Sort Base Shufflegit
完全解密Spark的HashShuffle:这篇文章能够做为上一篇的延伸阅读,从源码级别讲解了HashShuffle的Shuffle Write和Shuffle Read,github
Spark 2.1.0 中 Sort-Based Shuffle 产生的内幕:这篇文章经过讲述HashShuffle的缺陷,引出Sort-Based Shuffle的出现原因和原理。从源码级别讲解了Sort-Based Shuffle的排序算法。算法
Spark Tungsten-sort Based Shuffle 分析:这篇文章从源码级别讲解了tungsten-sort的Shuffle Write和Shuffle Readmarkdown
Spark Shuffle之Tungsten-Sort:这篇文章讲解了tungsten-sort的底层UnsafeShuffleWriter的实现app
完全搞懂spark的shuffle过程(shuffle write):总结好文post
我在以个人理解简单的归纳下,若有不对,但愿你们及时斧正:性能
Hash Shuffle
是Spark 1.2以前的默认Shuffle实现,并在Spark 2.0版本中被移除。HashShuffle有个巨大的缺点,Shuffle前在磁盘上会产生海量的小文件,此时会产生大量耗时低效的 IO 操做Consolidated Hash Shuffle
是Hash Shuffle的优化版,会只产生Cores数量 x Reduce端数量的小文件。Sort-Based Shuffle
目前默认的Shuffle实现,Sorted-Based Shuffle 会把Mapper 中每一个ShuffleMapTask 全部的输出数据Data 只写到一个文件中。它会产生一个 Data 文件和一个 Index 文件,其中 Data 文件是存储当前 Task 的 Shuffle 输出的, 而 Index 文件则存储了 Data 文件中的数据经过 Partitioner 的分类信息,此时下一个阶段的 Stage 中的 Task 就是根据这个 Index 文件获取本身所须要抓取的上一个 Stage 中 ShuffleMapTask 所产生的数据;默认状况下的Sort-Based Shuffle
是会在溢写磁盘前,先根据key进行排序bypass模式的Sort-Based Shuffle
。spark.shuffle.sort.bypassMergeThreshold 默认值为200 ,若是shuffle map task的数量小于这个阀值200,且不是聚合类的shuffle算子(好比reduceByKey),则不会进行排序。 该机制与sortshuffle的普通机制相比,在map task很少的状况下,首先写的机制是不一样,其次不会进行排序。这样就能够节约一部分性能开销。Tungsten-sort Based Shuffle
:引入新的内存管理模型Page。我的理解是只对相似于指针或者index的二进制数据进行排序,因此会比Sort-Based Shuffle的针对java objects的排序更快。 当且仅当下面条件都知足时,才会使用新的Shuffle方式: