Spark _17 _SparkShuffle、HashShuffleManager、SortShuffleManager
SparkShuffle
-
SparkShuffle概念
reduceByKey會(huì)將上一個(gè)RDD中的每一個(gè)key對(duì)應(yīng)的所有value聚合成一個(gè)value,然后生成一個(gè)新的RDD,元素類型是<key,value>對(duì)的形式,這樣每一個(gè)key對(duì)應(yīng)一個(gè)聚合起來的value。
問題:聚合之前,每一個(gè)key對(duì)應(yīng)的value不一定都是在一個(gè)partition中,也不太可能在同一個(gè)節(jié)點(diǎn)上,因?yàn)镽DD是分布式的彈性的數(shù)據(jù)集,RDD的partition極有可能分布在各個(gè)節(jié)點(diǎn)上。
如何聚合?
– Shuffle Write:上一個(gè)stage的每個(gè)map task就必須保證將自己處理的當(dāng)前分區(qū)的數(shù)據(jù)相同的key寫入一個(gè)分區(qū)文件中,可能會(huì)寫入多個(gè)不同的分區(qū)文件中。
?– Shuffle Read:reduce task就會(huì)從上一個(gè)stage的所有task所在的機(jī)器上尋找屬于己的那些分區(qū)文件,這樣就可以保證每一個(gè)key所對(duì)應(yīng)的value都會(huì)匯聚到同一個(gè)節(jié)點(diǎn)上去處理和聚合。
Spark中有兩種Shuffle管理類型,HashShufflManager和SortShuffleManager,Spark1.2之前是HashShuffleManager, Spark1.2引入SortShuffleManager,在Spark 2.0+版本中已經(jīng)將HashShuffleManager丟棄。
?HashShuffleManager
- 普通機(jī)制
- 普通機(jī)制示意圖
?
- 執(zhí)行流程
- 總結(jié)
M(map task的個(gè)數(shù))*R(reduce task的個(gè)數(shù))
- 存在的問題
? ? ?產(chǎn)生的磁盤小文件過多,會(huì)導(dǎo)致以下問題:
- ??合并機(jī)制
- 合并機(jī)制示意圖
- 總結(jié)
產(chǎn)生磁盤小文件的個(gè)數(shù):C(core的個(gè)數(shù))*R(reduce的個(gè)數(shù))
SortShuffleManager
- 普通機(jī)制
- 普通機(jī)制示意圖
?
- 執(zhí)行流程
- 總結(jié)
產(chǎn)生磁盤小文件的個(gè)數(shù): 2*M(map task的個(gè)數(shù))
- ?bypass機(jī)制
- bypass機(jī)制示意圖
?
- 總結(jié)
- .bypass運(yùn)行機(jī)制的觸發(fā)條件如下:
? ? ? ? ? ? shuffle reduce task的數(shù)量小于spark.shuffle.sort.bypassMergeThreshold的參數(shù)值。這個(gè)值默認(rèn)是200。
- .產(chǎn)生的磁盤小文件為:2*M(map task的個(gè)數(shù))
總結(jié)
以上是生活随笔為你收集整理的Spark _17 _SparkShuffle、HashShuffleManager、SortShuffleManager的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark _16 _SparkUIMa
- 下一篇: Spark _18 _Shuffle文件