共計(jì) 2543 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
這期內(nèi)容當(dāng)中丸趣 TV 小編將會(huì)給大家?guī)?lái)有關(guān)如何解決 JobTracker Heap 的 OOM 問(wèn)題,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
引子
最近新上了 9107 渠道的實(shí)驗(yàn)。
從實(shí)驗(yàn)方法上,相比于之前的 9105 渠道只是簡(jiǎn)單地對(duì)過(guò)去 6 小時(shí)的正例數(shù)據(jù)進(jìn)行翻倍,9107 則以當(dāng)前時(shí)間為基準(zhǔn),使用指數(shù)函數(shù)對(duì)合并后訓(xùn)練數(shù)據(jù)中的正例進(jìn)行增益。
從具體的實(shí)現(xiàn)而言,為了實(shí)現(xiàn)的簡(jiǎn)單,實(shí)驗(yàn)的 ETL 部分依舊沿用 Hadoop 進(jìn)行 ETL 合并處理,但后續(xù)的 Sampling 和 Filtering 則采用 python 單機(jī)實(shí)現(xiàn)。經(jīng)過(guò)流程和數(shù)據(jù)測(cè)試無(wú)誤后上線,但結(jié)果老集群的 JobTracher 總是在跑了 70 多個(gè) Job 之后就報(bào)出 Heap OOM 異常 (java.lang.OutOfMemoryError: Java heap space)。
解決過(guò)程
直接 google
在 statckoverflow 中有人建議調(diào)整 HADOOP_CLIENT_OPT,通過(guò)增大其 Xmx 解決該問(wèn)題,經(jīng)過(guò)嘗試后發(fā)現(xiàn)無(wú)效果。
突然發(fā)現(xiàn) java_pidxxxxx.hprof 文件,搜索相關(guān)資料,發(fā)現(xiàn) Eclipse 中的 MAT 工具,分析可能為 JT 的問(wèn)題
hprof 為當(dāng)虛擬機(jī)中發(fā)生 OOM 錯(cuò)誤時(shí),自動(dòng)對(duì) Heap 進(jìn)行轉(zhuǎn)儲(chǔ)生成的二進(jìn)制文件。在啟動(dòng)進(jìn)程時(shí),可以通過(guò)添加參數(shù) -XX:+HeapDumpOnOutOfMemoryError 開啟該功能。
MAT(Memory Analyzer) 為 Eclipse 中一分析 hprof 文件的工具,可以通過(guò) Eclipse 中的 Install New Software 進(jìn)行集成。需要注意的一點(diǎn)是,當(dāng)生成的 hprof 文件過(guò)大的時(shí)候,需要適當(dāng)增大 eclipse 的啟動(dòng) Xmx,其配置文件為安裝目錄下的 eclipse.ini。
通過(guò) MAT 打開生成的 hprof 文件,如下圖所示,會(huì)給出幾條 Problem Suspect,在本文中,說(shuō)明是由于 JobTracker 的占用內(nèi)存過(guò)大導(dǎo)致的 OOM。
但是之前 JobTracker 穩(wěn)定運(yùn)行了好長(zhǎng)時(shí)間,很少發(fā)生過(guò)該種現(xiàn)象,所以繼續(xù)嘗試使用 MAT 進(jìn)行進(jìn)一步的分析。通過(guò)對(duì) dominator tree 一項(xiàng)進(jìn)行分析發(fā)現(xiàn),JobTracker 中絕大部分的內(nèi)存都是由 JobInProgress 占用的,其結(jié)果如下圖所示。
至此,問(wèn)題算是已經(jīng)定位出來(lái),但是之前的 JobTracker 跑了上千的 Job 也從來(lái)沒有發(fā)生過(guò)該種問(wèn)題,為什么這次只跑了 70+ 個(gè) Job 就發(fā)生了這種情況。
翻閱 Hadoop 技術(shù)內(nèi)幕,了解 JobTracker 的主要作用
google 搜索并沒有這方面很好地解答,就找了 Hadoop 技術(shù)內(nèi)幕 一書中關(guān)于 JobTracker 的一章節(jié)進(jìn)行學(xué)習(xí)。有一點(diǎn)特別引起了我的注意,原來(lái) JobTracker 在啟動(dòng)的時(shí)候會(huì)啟動(dòng)一些重要的線程和服務(wù),其中有一個(gè) retireJobsThread 線程。
對(duì)于 retireJobsThread 線程而言,它可以清理長(zhǎng)時(shí)間駐留在內(nèi)存的已經(jīng)運(yùn)行結(jié)束的 Job 信息 (即 JobInProgress 對(duì)象的信息)。而將 JobInProgress 對(duì)象保存在內(nèi)存中,則是為了方便外部對(duì)歷史的 Job 信息進(jìn)行查詢。但由于 JobInProgress 對(duì)象會(huì)占用過(guò)多的內(nèi)存,所以當(dāng) Job 同時(shí)滿足條件 a,b 或是 a,c 時(shí),就會(huì)被標(biāo)志為過(guò)期的作業(yè)。
Job 已經(jīng)完成,即狀態(tài)為 SUCCEEDED,F(xiàn)AILED 或 KILLED
Job 完成時(shí)間距離當(dāng)前已經(jīng) 24 小時(shí)(可以通過(guò) mapred.jobtracker.retirejob.interval 調(diào)整)
Job 擁有者已完成的 Job 數(shù)量大于 100(可以通過(guò) mapred.jobtracker.completeuserjobs.maximum 調(diào)整)
顯然正是由于 Job 的 retire 機(jī)制,避免了 JobTracker 占用內(nèi)存的無(wú)線膨脹。雖然解決了 JobTracker 占用內(nèi)存的無(wú)限膨脹問(wèn)題,但是為什么之前的 JobTracker 就能維護(hù) 100 個(gè) JobInProgress,而現(xiàn)在就不可以了呢?9105 和 9107 渠道到底差到了什么地方了呢?
突然間,想到了是不是由于 ETL Job 占用的內(nèi)存信息過(guò)大,導(dǎo)致當(dāng)前 2G 的 HeapSize 放不下這 100 條 JobInProgress 信息呢。于是,將 hadoop-env.sh 中的 HADOOP_HEAPSIZE 從 2000 調(diào)整到了 4000,問(wèn)題神奇的就沒有再出現(xiàn)過(guò)。那么究竟是為什么 ETL Job 會(huì)比 Sampling Job 和 Filtering Job 占用更多的內(nèi)存呢?于是就有了最后一步 …
實(shí)際實(shí)驗(yàn)測(cè)試,使用 jmap 生成 hprof 文件,分析與預(yù)期的結(jié)果
在集群平穩(wěn)的運(yùn)行了 100+ 個(gè) Job 之后,使用 jmap 工具 dump 出來(lái)了一份 JobTracker 的 hprof 文件。再次使用 MAT 對(duì)其進(jìn)行分析,結(jié)果如下圖所示:
由圖可以看出以下幾點(diǎn):
JobTracker 的內(nèi)存占用一直保持在 1.7G 左右
針對(duì)于 JobInProgress 占用內(nèi)存過(guò)大的原因,完全是由于其需要調(diào)度的 TaskInProgress 過(guò)多(一般為 2K-3K 個(gè)),從而比 Sampling 和 Filtering 耗費(fèi)掉更多的內(nèi)存
至此,問(wèn)題解決,確實(shí)是因?yàn)?9107 渠道只保留了 9105 渠道的 ETL Job,導(dǎo)致多個(gè) ETL JobInPregress 累計(jì)占用內(nèi)存遠(yuǎn)大于之前的 9105 實(shí)驗(yàn),從而造成 JobTracker 一直產(chǎn)生 OOM 錯(cuò)誤。
心得總結(jié)
說(shuō)起來(lái),問(wèn)題的解決多多少少還是存在一定的偶然性,歸根結(jié)底還是在于對(duì) Hadoop 平臺(tái)一些基礎(chǔ)組件的底層實(shí)現(xiàn)不熟悉,從而導(dǎo)致問(wèn)題定位慢,走了不少的彎路
MAT 確實(shí)是一個(gè)特別強(qiáng)大的工具,針對(duì)于 JVM 的 OOM 錯(cuò)誤而言,通過(guò)使用 MAT 能夠非常方便的定位問(wèn)題的根結(jié)。后續(xù)對(duì) MAT 的學(xué)習(xí)使用還需要進(jìn)一步的加強(qiáng)。
對(duì)于正常運(yùn)行中的 java 進(jìn)程,可以使用 jmap 的 jmap -dump:format=b,file=xx pid 命令生成 hprof 文件,從而分析某一時(shí)刻進(jìn)程中內(nèi)存的詳細(xì)使用情況
上述就是丸趣 TV 小編為大家分享的如何解決 JobTracker Heap 的 OOM 問(wèn)題了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道。