1. 程式人生 > >Spark學習之Spark Shuffle

Spark學習之Spark Shuffle

文章目錄

一、什麼是Spark Shuffle?

1、Shuffle中文意思就是“洗牌”,在Spark中Shuffle的目的是為了保證每一個key所對應的value都會匯聚到同一個節點上去處理和聚合。
2、在Spark中,什麼情況下會發生shuffle?
reduceByKey、groupByKey、sortByKey、countByKey、join等操作。


3、Spark中的Shuffle包括兩種:

  1. HashShuffle
  2. SortShuffle

二、HashShuffle執行原理

Spark Shuffle圖解
Shuffle Write階段:

由於Stage後面緊跟了另一個Stage,所以資料落地會發生在Shuffle Write階段。為了將分割槽中資料相同的key寫入一個分割槽檔案中,需要將task計算結果的key的hashcode值與Reduce task個數取模,從而確定將結果寫入哪個分割槽檔案中,這樣即可保證相同的key在一個分割槽檔案中。為了加快向磁碟寫檔案的速度,需要事先設定一個buffer作為快取,每個buffer的大小是32K。

Shuffle Red階段:

Reduce task從上個Stage的task節點中拉取屬於自己的分割槽檔案,這樣即可保證每一個Key所對應的Value都會在同一個節點上。拉取的過程屬於現拉現用

三、Shuffle可能面臨的問題?

由上圖可知:磁碟小檔案(分割槽檔案)的個數=m(map task num)*r(reduce task num)
當磁碟小檔案過多時,帶來的問題有:

  1. write階段會建立大量寫檔案的物件
  2. read階段拉取資料需要進行多次網路傳輸
  3. read階段會建立大量讀檔案的物件
  4. 讀寫物件過多造成JVM記憶體不足,從而導致記憶體溢位

為了解決磁碟小檔案過多,Spark中推出了合併機制來減少磁碟小檔案。
合併機制:
倘若Executor只有一個core,所以每次只能有一個task執行,當第一個task執行完成後,第二個task會複用第一個task所建立的buffer磁碟檔案,從而減少磁碟檔案的個數。
合併前:
合併機制執行前磁碟小檔案數為12
合併後:
合併機制執行前磁碟小檔案數為6

四、如何優化解決問題?

五、SortShuffle執行原理

未完待續。。。