在運(yùn)行我的 Spark 應(yīng)用程序時(shí),我有 100% 的可重現(xiàn)性O(shè)utOfMemoryError(通常是由于超過(guò)了 GC 開(kāi)銷限制)。這大約發(fā)生在第 700 個(gè)階段。.ui.由于錯(cuò)誤堆??偸前⒌阮怲askSchedulerImpl,因此我得出結(jié)論,問(wèn)題不在于執(zhí)行程序,而在于驅(qū)動(dòng)程序進(jìn)程本身。這個(gè)結(jié)論得到以下觀察結(jié)果的支持:在 OOM 發(fā)生前幾分鐘,stdout輸出開(kāi)始暫停一秒左右,暫停后立即打印大量行。spark.driver.memory配置為10G,但是使用的調(diào)試工具顯示驅(qū)動(dòng)只使用了1Gb:我使用了這些關(guān)于收集 GC 統(tǒng)計(jì)數(shù)據(jù)并使用gceasy.io服務(wù)對(duì)其進(jìn)行分析的重要說(shuō)明;它清楚地表明:GC 后的最大堆使用量約為 1Gb。接近 OOM 的時(shí)刻,'heap usage' 圖幾乎觸及 1Gb 的最大值,而大量的 GC 事件未能影響到這一點(diǎn)。GC overhead limit exceeded處于最佳狀態(tài)。我使用MAT分析了在 OutOfMemoryError 之后立即創(chuàng)建的堆轉(zhuǎn)儲(chǔ)。堆轉(zhuǎn)儲(chǔ)包含大約相同的 1Gb 數(shù)據(jù)。支配樹(shù)顯示其中一半以上被 UI 對(duì)象消耗。我已經(jīng)使用這個(gè)問(wèn)題的答案來(lái)最小化保留的 UI 數(shù)據(jù)。結(jié)果,我的應(yīng)用程序成功運(yùn)行。但我還沒(méi)有準(zhǔn)備好放棄所有可以使用 Spark UI 探索的寶貴調(diào)試數(shù)據(jù)。另外,我找不到任何關(guān)于 Spark 驅(qū)動(dòng)程序內(nèi)存模型的解釋。問(wèn)題是:我如何保留 UI 調(diào)試數(shù)據(jù)并且不在我的驅(qū)動(dòng)程序上遇到 OOM?
1 回答

慕蓋茨4494581
TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
實(shí)際問(wèn)題是驅(qū)動(dòng)程序進(jìn)程只使用了 1Gb 的內(nèi)存,盡管設(shè)置了spark.driver.memory=10G
.
根據(jù)文檔:在客戶端模式下,不得通過(guò) SparkConf 直接在您的應(yīng)用程序中設(shè)置此配置(spark.driver.memory),因?yàn)榇藭r(shí)驅(qū)動(dòng)程序 JVM 已經(jīng)啟動(dòng)。相反,請(qǐng)通過(guò) --driver-memory 命令行選項(xiàng)或在您的默認(rèn)屬性文件中進(jìn)行設(shè)置。
我正在使用客戶端模式。將設(shè)置從 Spark 上下文參數(shù)移動(dòng)到 spark-submit 命令行參數(shù)解決了這個(gè)問(wèn)題。
PS“如果沒(méi)有按預(yù)期工作,請(qǐng)閱讀手冊(cè)”(c)。
添加回答
舉報(bào)
0/150
提交
取消