什麼是shuffle?爲什麼shuffle?什麼算子shuffle?

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數據的笛卡爾乘積。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章