Spark性能優(yōu)化 (4) | JVM 調(diào)優(yōu)
大家好,我是不溫卜火,是一名計(jì)算機(jī)學(xué)院大數(shù)據(jù)專業(yè)大二的學(xué)生,昵稱來源于成語—不溫不火,本意是希望自己性情溫和。作為一名互聯(lián)網(wǎng)行業(yè)的小白,博主寫博客一方面是為了記錄自己的學(xué)習(xí)過程,另一方面是總結(jié)自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新。但由于水平有限,博客中難免會有一些錯誤出現(xiàn),有紕漏之處懇請各位大佬不吝賜教!暫時只有csdn這一個平臺,博客主頁:https://buwenbuhuo.blog.csdn.net/
本片博文為大家?guī)淼氖荍VM 調(diào)優(yōu)。
目錄
1. 降低cache操作的內(nèi)存占比
2. 調(diào)節(jié)Executor堆外內(nèi)存
3. 調(diào)節(jié)連接等待時長
對于 JVM 調(diào)優(yōu),首先應(yīng)該明確,full gc/minor gc,都會導(dǎo)致JVM的工作線程停止工作,即stop the world。
1. 降低cache操作的內(nèi)存占比
靜態(tài)內(nèi)存管理機(jī)制
根據(jù) Spark 靜態(tài)內(nèi)存管理機(jī)制,堆內(nèi)存被劃分為了兩塊,Storage 和 Execution。
Storage 主要用于緩存 RDD數(shù)據(jù)和 broadcast 數(shù)據(jù),Execution主要用于緩存在shuffle過程中產(chǎn)生的中間數(shù)據(jù),Storage占系統(tǒng)內(nèi)存的60%,Execution占系統(tǒng)內(nèi)存的20%,并且兩者完全獨(dú)立。 在一般情況下,Storage的內(nèi)存都提供給了cache操作,但是如果在某些情況下cache操作內(nèi)存不是很緊張,而task的算子中創(chuàng)建的對象很多,Execution內(nèi)存又相對較小,這回導(dǎo)致頻繁的minor gc,甚至于頻繁的full gc,進(jìn)而導(dǎo)致Spark頻繁的停止工作,性能影響會很大。 在Spark UI中可以查看每個stage的運(yùn)行情況,包括每個task的運(yùn)行時間、gc時間等等,如果發(fā)現(xiàn)gc太頻繁,時間太長,就可以考慮調(diào)節(jié)Storage的內(nèi)存占比,讓task執(zhí)行算子函數(shù)式,有更多的內(nèi)存可以使用。 Storage內(nèi)存區(qū)域可以通過spark.storage.memoryFraction參數(shù)進(jìn)行指定,默認(rèn)為0.6,即60%,可以逐級向下遞減,
val conf = new SparkConf() .set("spark.storage.memoryFraction", "0.4")
1
2
3
統(tǒng)一內(nèi)存管理機(jī)制
根據(jù)Spark統(tǒng)一內(nèi)存管理機(jī)制,堆內(nèi)存被劃分為了兩塊,Storage 和 Execution。Storage 主要用于緩存數(shù)據(jù),Execution 主要用于緩存在 shuffle 過程中產(chǎn)生的中間數(shù)據(jù),兩者所組成的內(nèi)存部分稱為統(tǒng)一內(nèi)存,Storage和Execution各占統(tǒng)一內(nèi)存的50%,由于動態(tài)占用機(jī)制的實(shí)現(xiàn),shuffle 過程需要的內(nèi)存過大時,會自動占用Storage 的內(nèi)存區(qū)域,因此無需手動進(jìn)行調(diào)節(jié)。
2. 調(diào)節(jié)Executor堆外內(nèi)存
Executor 的堆外內(nèi)存主要用于程序的共享庫、Perm Space、 線程Stack和一些Memory mapping等, 或者類C方式allocate object。
有時,如果你的Spark作業(yè)處理的數(shù)據(jù)量非常大,達(dá)到幾億的數(shù)據(jù)量,此時運(yùn)行 Spark 作業(yè)會時不時地報錯,例如shuffle output file cannot find,executor lost,task lost,out of memory等,這可能是Executor的堆外內(nèi)存不太夠用,導(dǎo)致 Executor 在運(yùn)行的過程中內(nèi)存溢出。
stage 的 task 在運(yùn)行的時候,可能要從一些 Executor 中去拉取 shuffle map output 文件,但是 Executor 可能已經(jīng)由于內(nèi)存溢出掛掉了,其關(guān)聯(lián)的 BlockManager 也沒有了,這就可能會報出 shuffle output file cannot find,executor lost,task lost,out of memory等錯誤,此時,就可以考慮調(diào)節(jié)一下Executor的堆外內(nèi)存,也就可以避免報錯,與此同時,堆外內(nèi)存調(diào)節(jié)的比較大的時候,對于性能來講,也會帶來一定的提升。
默認(rèn)情況下,Executor 堆外內(nèi)存上限大概為300多MB,在實(shí)際的生產(chǎn)環(huán)境下,對海量數(shù)據(jù)進(jìn)行處理的時候,這里都會出現(xiàn)問題,導(dǎo)致Spark作業(yè)反復(fù)崩潰,無法運(yùn)行,此時就會去調(diào)節(jié)這個參數(shù),到至少1G,甚至于2G、4G。
Executor堆外內(nèi)存的配置需要在spark-submit腳本里配置,
--conf spark.executor.memoryOverhead=2048
1
以上參數(shù)配置完成后,會避免掉某些JVM OOM的異常問題,同時,可以提升整體 Spark 作業(yè)的性能。
3. 調(diào)節(jié)連接等待時長
在 Spark 作業(yè)運(yùn)行過程中,Executor 優(yōu)先從自己本地關(guān)聯(lián)的 BlockManager 中獲取某份數(shù)據(jù),如果本地BlockManager沒有的話,會通過TransferService遠(yuǎn)程連接其他節(jié)點(diǎn)上Executor的BlockManager來獲取數(shù)據(jù)。
如果 task 在運(yùn)行過程中創(chuàng)建大量對象或者創(chuàng)建的對象較大,會占用大量的內(nèi)存,這會導(dǎo)致頻繁的垃圾回收,但是垃圾回收會導(dǎo)致工作現(xiàn)場全部停止,也就是說,垃圾回收一旦執(zhí)行,Spark 的 Executor 進(jìn)程就會停止工作,無法提供相應(yīng),此時,由于沒有響應(yīng),無法建立網(wǎng)絡(luò)連接,會導(dǎo)致網(wǎng)絡(luò)連接超時。
在生產(chǎn)環(huán)境下,有時會遇到file not found、file lost這類錯誤,在這種情況下,很有可能是Executor的BlockManager在拉取數(shù)據(jù)的時候,無法建立連接,然后超過默認(rèn)的連接等待時長120s后,宣告數(shù)據(jù)拉取失敗,如果反復(fù)嘗試都拉取不到數(shù)據(jù),可能會導(dǎo)致 Spark 作業(yè)的崩潰。這種情況也可能會導(dǎo)致 DAGScheduler 反復(fù)提交幾次 stage,TaskScheduler 返回提交幾次 task,大大延長了我們的 Spark 作業(yè)的運(yùn)行時間。
此時,可以考慮調(diào)節(jié)連接的超時時長,連接等待時長需要在spark-submit腳本中進(jìn)行設(shè)置
--conf spark.core.connection.ack.wait.timeout=300
1
調(diào)節(jié)連接等待時長后,通常可以避免部分的XX文件拉取失敗、XX文件lost等報錯。
本次的分享就到這里了,
好書不厭讀百回,熟讀課思子自知。而我想要成為全場最靚的仔,就必須堅(jiān)持通過學(xué)習(xí)來獲取更多知識,用知識改變命運(yùn),用博客見證成長,用行動證明我在努力。
如果我的博客對你有幫助、如果你喜歡我的博客內(nèi)容,請“” “評論”“”一鍵三連哦!聽說的人運(yùn)氣不會太差,每一天都會元?dú)鉂M滿呦!如果實(shí)在要白嫖的話,那祝你開心每一天,歡迎常來我博客看看。
碼字不易,大家的支持就是我堅(jiān)持下去的動力。后不要忘了關(guān)注我哦!
JVM spark
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。