天天看點

SPARK裡的shuffle

定義

  • shuffle中文一般稱為 資料混洗。
  • shuffle的官方定義是,它是spark的一種讓資料重新分布以使得某些資料被放在同一分區裡的一種機制。

例子

比如reduceByKey操作。

有時,同一個key的value并沒有分布在同一個partition裡,甚至沒有分布在同一台機器裡,而是存放在叢集裡的某一個其他地方。這時,Spark就會搜集所有的data,并把這些值集合在一起再進行reduce。這就是一次shuffle。

shuffle後,如果需要對資料進行排序等,也可以以下操作:

  • mapPartitions
  • repartitionAndSortWithinPartitions
  • sortBy

能引起shuffle的操作有:

  1. repartition and coalesce (repartion操作)
  2. groupByKey and reduceByKey (對Key操作)
  3. cogroup and join (join操作)

性能影響

  • shuffle操作涉及到網絡傳輸資料,可能還有序列化的問題。它通過map來組織資料,通過reduce來聚集,(這裡的mapreduce隻是作為Hadoop的mapreduce意義的一種引申)
  • shuffle操作會占用堆記憶體,當記憶體不夠用時,就會把資料放到磁盤上。
  • shuffle操作會在磁盤上産生大量的中間檔案,這些檔案隻有在相關的RDD不再使用并被回收後,才會被删除。這樣做的目的是多次shuffle的時候,不用重複進行計算。是以,長時間運作Spark的任務必定消耗巨大的磁盤空間。臨時檔案的目錄可以通過spark.local.dir進行設定。

繼續閱讀