Spark _20 _Spark_Shuffle调优
SparkShuffle調(diào)優(yōu)配置項(xiàng)如何使用?
- 在代碼中,不推薦使用,硬編碼。
new SparkConf().set(“spark.shuffle.file.buffer”,”64”)
- 在提交spark任務(wù)的時(shí)候,推薦使用。
spark-submit --conf spark.shuffle.file.buffer=64 –conf ….
- 在conf下的spark-default.conf配置文件中,不推薦,因?yàn)槭菍懰篮笏袘?yīng)用程序都要用。
?
Shuffle各項(xiàng)調(diào)優(yōu)參數(shù)
spark.shuffle.file.buffer
默認(rèn)值:32k
參數(shù)說明:該參數(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ù)用于設(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
參數(shù)說明: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ù)(比如60次),以避免由于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)定性。
shuffle file not find ? ?taskScheduler不負(fù)責(zé)重試task,由DAGScheduler負(fù)責(zé)重試stage
spark.shuffle.io.retryWait
默認(rèn)值:5s
參數(shù)說明:具體解釋同上,該參數(shù)代表了每次重試?yán)?shù)據(jù)的等待間隔,默認(rèn)是5s。
調(diào)優(yōu)建議:建議加大間隔時(shí)長(zhǎng)(比如60s),以增加shuffle操作的穩(wěn)定性。
spark.shuffle.memoryFraction
默認(rèn)值:0.2
參數(shù)說明:該參數(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|hash
參數(shù)說明:該參數(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
參數(shù)說明:當(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
參數(shù)說明:如果使用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%。
總結(jié)
以上是生活随笔為你收集整理的Spark _20 _Spark_Shuffle调优的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark _19 _Spark内存管理
- 下一篇: Spark2.3.0的DataFrame