在Spark 1.1之前,Spark中只实现了一种Shuffle方式,即基于Hash的Shuffle。在Spark 1.1版本引入了基于Sort的Shuffle实现方式后,并且在Spark 1.2版本之后,默认的实现方式从基于Hash的Shuffle修改为基于Sort的Shuffle实现方式,即使用的ShuffleManager从默认的hash修改为sort。
Spark之所以一开始就提供基于Hash的Shuffle实现机制,其主要目的之一就是为了避免不必要的排序(这也是Hadoop Map Reduce被人所诟病的地方,将Sort作为固定步骤,导致了许多不必要的开销)。但基于Hash的Shuffle实现机制在处理超大规模数据集时,由于过程中会产生大量的文件,导致过度的磁盘I/O开销和内存开销,会极大地影响性能。
但在一些特定的应用场景下,采用基于Hash的实现Shuffle机制的性能会超过基于Sort的Shuffle实现机制。关于基于Hash与基于Sort的Shuffle实现机制的性能测试方面,可以参考Spark创始人之一ReynoldXin所给的测试:“sort-basedshuffle has lower memory usage and seems to outperformhash-based in almost allof our testing”。(www.xing528.com)
相关数据可以参考https://issues.apache.org/jira/browse/SPARK-3280。
因此,在Spark 1.2版本中修改为默认基于Sort的Shuffle实现机制时,同时也给出了特定应用场景下回退的机制,具体可以参考7.4节基于Sort的Shuffle实现机制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。