Shuffle參數(shù)
spark.shuffle.file.buffer
默認(rèn)值:32k
該參數(shù)用于設(shè)置shuffle write task的BufferedOutputStream的buffer緩沖大小妖啥。將數(shù)據(jù)寫到磁盤文件之前,會(huì)先寫入buffer緩沖中完疫,待緩沖寫滿之后,才會(huì)溢寫到磁盤斟赚。
調(diào)優(yōu)建議:如果作業(yè)可用的內(nèi)存資源較為充足的話喊巍,可以適當(dāng)增加這個(gè)參數(shù)的大小(比如64k)掘猿,從而減少shuffle write過程中溢寫磁盤文件的次數(shù)锥涕,也就可以減少磁盤IO次數(shù)衷戈,進(jìn)而提升性能。在實(shí)踐中發(fā)現(xiàn)层坠,合理調(diào)節(jié)該參數(shù)殖妇,性能會(huì)有1%~5%的提升。
spark.reducer.maxSizeInFlight
默認(rèn)值:48m
該參數(shù)用于設(shè)置shuffle read task的buffer緩沖大小破花,而這個(gè)buffer緩沖決定了每次能夠拉取多少數(shù)據(jù)谦趣。
調(diào)優(yōu)建議:如果作業(yè)可用的內(nèi)存資源較為充足的話,可以適當(dāng)增加這個(gè)參數(shù)的大凶俊(比如96m)前鹅,從而減少拉取數(shù)據(jù)的次數(shù),也就可以減少網(wǎng)絡(luò)傳輸?shù)拇螖?shù)峭梳,進(jìn)而提升性能舰绘。在實(shí)踐中發(fā)現(xiàn),合理調(diào)節(jié)該參數(shù)葱椭,性能會(huì)有1%~5%的提升捂寿。
spark.shuffle.io.maxRetries
默認(rèn)值:3
shuffle read task從shuffle write task所在節(jié)點(diǎn)拉取屬于自己的數(shù)據(jù)時(shí),如果因?yàn)榫W(wǎng)絡(luò)異常導(dǎo)致拉取失敗孵运,是會(huì)自動(dòng)進(jìn)行重試的秦陋。該參數(shù)就代表了可以重試的最大次數(shù)。如果在指定次數(shù)之內(nèi)拉取還是沒有成功治笨,就可能會(huì)導(dǎo)致作業(yè)執(zhí)行失敗驳概。
調(diào)優(yōu)建議:對(duì)于那些包含了特別耗時(shí)的shuffle操作的作業(yè),建議增加重試最大次數(shù)(比如10次)旷赖,以避免由于JVM的full gc或者網(wǎng)絡(luò)不穩(wěn)定等因素導(dǎo)致的數(shù)據(jù)拉取失敗顺又。在實(shí)踐中發(fā)現(xiàn),對(duì)于針對(duì)超大數(shù)據(jù)量(數(shù)十億~上百億)的shuffle過程杠愧,調(diào)節(jié)該參數(shù)可以大幅度提升穩(wěn)定性待榔。
spark.shuffle.io.retryWait
默認(rèn)值:5s
具體解釋同上逞壁,該參數(shù)代表了每次重試?yán)?shù)據(jù)的等待間隔流济,默認(rèn)是5s锐锣。
調(diào)優(yōu)建議:建議加大間隔時(shí)長(比如60s),以增加shuffle操作的穩(wěn)定性绳瘟。
spark.shuffle.memoryFraction
默認(rèn)值:0.2
該參數(shù)代表了Executor內(nèi)存中雕憔,分配給shuffle read task進(jìn)行聚合操作的內(nèi)存比例,默認(rèn)是20%糖声。
調(diào)優(yōu)建議:在資源參數(shù)調(diào)優(yōu)中講解過這個(gè)參數(shù)斤彼。如果內(nèi)存充足,而且很少使用持久化操作蘸泻,建議調(diào)高這個(gè)比例琉苇,給shuffle read的聚合操作更多內(nèi)存,以避免由于內(nèi)存不足導(dǎo)致聚合過程中頻繁讀寫磁盤悦施。在實(shí)踐中發(fā)現(xiàn)并扇,合理調(diào)節(jié)該參數(shù)可以將性能提升10%左右。
spark.shuffle.manager
默認(rèn)值:sort
該參數(shù)用于設(shè)置ShuffleManager的類型抡诞。Spark 1.5以后穷蛹,有三個(gè)可選項(xiàng):hash、sort和tungsten-sort昼汗。HashShuffleManager是Spark 1.2以前的默認(rèn)選項(xiàng)肴熏,但是Spark 1.2以及之后的版本默認(rèn)都是SortShuffleManager了。tungsten-sort與sort類似顷窒,但是使用了tungsten計(jì)劃中的堆外內(nèi)存管理機(jī)制蛙吏,內(nèi)存使用效率更高。
調(diào)優(yōu)建議:由于SortShuffleManager默認(rèn)會(huì)對(duì)數(shù)據(jù)進(jìn)行排序蹋肮,因此如果你的業(yè)務(wù)邏輯中需要該排序機(jī)制的話出刷,則使用默認(rèn)的SortShuffleManager就可以;而如果你的業(yè)務(wù)邏輯不需要對(duì)數(shù)據(jù)進(jìn)行排序坯辩,那么建議參考后面的幾個(gè)參數(shù)調(diào)優(yōu)馁龟,通過bypass機(jī)制或優(yōu)化的HashShuffleManager來避免排序操作,同時(shí)提供較好的磁盤讀寫性能漆魔。這里要注意的是坷檩,tungsten-sort要慎用,因?yàn)橹鞍l(fā)現(xiàn)了一些相應(yīng)的bug改抡。
spark.shuffle.sort.bypassMergeThreshold
默認(rèn)值:200
當(dāng)ShuffleManager為SortShuffleManager時(shí)矢炼,如果shuffle read task的數(shù)量小于這個(gè)閾值(默認(rèn)是200),則shuffle write過程中不會(huì)進(jìn)行排序操作阿纤,而是直接按照未經(jīng)優(yōu)化的HashShuffleManager的方式去寫數(shù)據(jù)句灌,但是最后會(huì)將每個(gè)task產(chǎn)生的所有臨時(shí)磁盤文件都合并成一個(gè)文件,并會(huì)創(chuàng)建單獨(dú)的索引文件。
調(diào)優(yōu)建議:當(dāng)你使用SortShuffleManager時(shí)胰锌,如果的確不需要排序操作骗绕,那么建議將這個(gè)參數(shù)調(diào)大一些,大于shuffle read task的數(shù)量资昧。那么此時(shí)就會(huì)自動(dòng)啟用bypass機(jī)制酬土,map-side就不會(huì)進(jìn)行排序了,減少了排序的性能開銷格带。但是這種方式下撤缴,依然會(huì)產(chǎn)生大量的磁盤文件,因此shuffle write性能有待提高叽唱。
spark.shuffle.consolidateFiles
默認(rèn)值:false
如果使用HashShuffleManager屈呕,該參數(shù)有效。如果設(shè)置為true棺亭,那么就會(huì)開啟consolidate機(jī)制凉袱,會(huì)大幅度合并shuffle write的輸出文件,對(duì)于shuffle read task數(shù)量特別多的情況下侦铜,這種方法可以極大地減少磁盤IO開銷专甩,提升性能。
調(diào)優(yōu)建議:如果的確不需要SortShuffleManager的排序機(jī)制钉稍,那么除了使用bypass機(jī)制涤躲,還可以嘗試將spark.shffle.manager參數(shù)手動(dòng)指定為hash,使用HashShuffleManager贡未,同時(shí)開啟consolidate機(jī)制种樱。在實(shí)踐中嘗試過,發(fā)現(xiàn)其性能比開啟了bypass機(jī)制的SortShuffleManager要高出10%~30%俊卤。