1、什麼是shuffle?
把父RDD中的KV對按照Key重新分區,從而得到一個新的RDD。也就是說原本同屬於父RDD同一個分區的數據需要進入到子RDD的不同的分區。
2、爲什麼需要shuffle?
在分佈式計算框架中,數據本地化是一個很重要的考慮,即計算需要被分發到數據所在的位置,從而減少數據的移動,提高運行效率。
Map-Reduce的輸入數據通常是HDFS中的文件,所以數據本地化要求map任務儘量被調度到保存了輸入文件的節點執行。但是,有一些計算邏輯是無法簡單地獲取本地數據的,reduce的邏輯都是如此。對於reduce來說,處理函數的輸入是key相同的所有value,但是這些value所在的數據集(即map的輸出)位於不同的節點上,因此需要對map的輸出進行重新組織,使得同樣的key進入相同的reducer。 shuffle移動了大量的數據,對計算、內存、網絡和磁盤都有巨大的消耗,因此,只有確實需要shuffle的地方纔應該進行shuffle,否則儘可能避免shuffle。
3、什麼時候shuffle?
1.去重操作:
Distinct等。
2.聚合,byKey類操作
reduceByKey、groupByKey、sortByKey等。
byKey類的操作要對一個key,進行聚合操作,那麼肯定要保證集羣中,所有節點上的相同的key,移動到同一個節點上進行處理。
3.排序操作:
sortByKey等。
4.重分區操作:
repartition、repartitionAndSortWithinPartitions、coalesce(shuffle=true)等。
重分區一般會shuffle,因爲需要在整個集羣中,對之前所有的分區的數據進行隨機,均勻的打亂,然後把數據放入下游新的指定數量的分區內。
5.集合或者表操作:
join、cogroup等。
兩個rdd進行join,就必須將相同join key的數據,shuffle到同一個節點上,然後進行相同key的兩個rdd數據的笛卡爾乘積。