Spark學習——排序Shuffle

其餘更多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方式:
    • Shuffle dependency 不能帶有aggregation 或者輸出須要排序
    • Shuffle 的序列化器須要是 KryoSerializer 或者 Spark SQL's 自定義的一些序列化方式.
    • Shuffle 文件的數量不能大於 16777216
    • 序列化時,單條記錄不能大於 128 MB
相關文章
相關標籤/搜索