Spark學習——排序Shuffle

Hiway發表於2019-04-03

其他更多java基礎文章:
java基礎學習(目錄)


這部分能力有限,所以推薦一些大神文章閱讀學習:

  • Apache Spark Shuffle 過程:這篇文章可以作為入門學習文章,主要講了Spark Shuffle和MapReduce Shuffle的對比、Shuffle Write和Shuffle Read的概念和原理、典型 transformation() 運算元的 shuffle read原理、Shuffle read 中的 HashMap模型
    由於文章編寫的比較舊了,所以是HashSHuffle原理的文章。但是仍然是非常好的一篇原理講解文章。瞭解了hashShuffle才能更好的瞭解後面的Sort Base Shuffle

  • 徹底解密Spark的HashShuffle:這篇文章可以作為上一篇的延伸閱讀,從原始碼級別講解了HashShuffle的Shuffle Write和Shuffle Read,

  • Spark 2.1.0 中 Sort-Based Shuffle 產生的內幕:這篇文章通過講述HashShuffle的缺陷,引出Sort-Based Shuffle的出現緣由和原理。從原始碼級別講解了Sort-Based Shuffle的排序演算法。

  • Spark Tungsten-sort Based Shuffle 分析:這篇文章從原始碼級別講解了tungsten-sort的Shuffle Write和Shuffle Read

  • Spark Shuffle之Tungsten-Sort:這篇文章講解了tungsten-sort的底層UnsafeShuffleWriter的實現

總結

我在以我的理解簡單的概括下,如有不對,希望大家及時斧正:

  • 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方式:
    • Shuffle dependency 不能帶有aggregation 或者輸出需要排序
    • Shuffle 的序列化器需要是 KryoSerializer 或者 Spark SQL's 自定義的一些序列化方式.
    • Shuffle 檔案的數量不能大於 16777216
    • 序列化時,單條記錄不能大於 128 MB

相關文章