原文地址: http://blog.javachen.com/2015/06/09/memory-in-Spark-on-yarn.html
本文主要了解Spark On YARN部署模式下的內(nèi)存分配情況五垮,因?yàn)闆](méi)有深入研究Spark的源代碼,所以只能根據(jù)日志去看相關(guān)的源代碼筷频,從而了解“為什么會(huì)這樣笼痹,為什么會(huì)那樣”嚼摩。
說(shuō)明
按照Spark應(yīng)用程序中的driver分布方式不同音羞,Spark on YARN有兩種模式: yarn-client模式帮哈、yarn-cluster模式司顿。
當(dāng)在YARN上運(yùn)行Spark作業(yè)伴找,每個(gè)Spark executor作為一個(gè)YARN容器運(yùn)行盈蛮。Spark可以使得多個(gè)Tasks在同一個(gè)容器里面運(yùn)行。
下圖是yarn-cluster模式的作業(yè)執(zhí)行圖技矮,圖片來(lái)源于網(wǎng)絡(luò):
關(guān)于Spark On YARN相關(guān)的配置參數(shù)抖誉,請(qǐng)參考Spark配置參數(shù)。本文主要討論內(nèi)存分配情況衰倦,所以只需要關(guān)注以下幾個(gè)內(nèi)心相關(guān)的參數(shù):
- spark.driver.memory:默認(rèn)值512m
- spark.executor.memory:默認(rèn)值512m
- spark.yarn.am.memory:默認(rèn)值512m
- spark.yarn.executor.memoryOverhead:值為executorMemory * 0.07, with minimum of 384
- spark.yarn.driver.memoryOverhead:值為driverMemory * 0.07, with minimum of 384
- spark.yarn.am.memoryOverhead:值為AM memory * 0.07, with minimum of 384
注意:
- --executor-memory/spark.executor.memory 控制 executor 的堆的大小袒炉,但是 JVM 本身也會(huì)占用一定的堆空間,比如內(nèi)部的 String 或者直接 byte buffer樊零,spark.yarn.XXX.memoryOverhead屬性決定向 YARN 請(qǐng)求的每個(gè) executor 或dirver或am 的額外堆內(nèi)存大小我磁,默認(rèn)值為 max(384, 0.07 * spark.executor.memory)
- 在 executor 執(zhí)行的時(shí)候配置過(guò)大的 memory 經(jīng)常會(huì)導(dǎo)致過(guò)長(zhǎng)的GC延時(shí)孽文,64G是推薦的一個(gè) executor 內(nèi)存大小的上限。
- HDFS client 在大量并發(fā)線程時(shí)存在性能問(wèn)題夺艰。大概的估計(jì)是每個(gè) executor 中最多5個(gè)并行的 task 就可以占滿(mǎn)寫(xiě)入帶寬
另外芋哭,因?yàn)槿蝿?wù)是提交到Y(jié)ARN上運(yùn)行的,所以YARN中有幾個(gè)關(guān)鍵參數(shù)郁副,參考YARN的內(nèi)存和CPU配置: - yarn.app.mapreduce.am.resource.mb:AM能夠申請(qǐng)的最大內(nèi)存减牺,默認(rèn)值為1536MB
- yarn.nodemanager.resource.memory-mb:nodemanager能夠申請(qǐng)的最大內(nèi)存,默認(rèn)值為8192MB
- yarn.scheduler.minimum-allocation-mb:調(diào)度時(shí)一個(gè)container能夠申請(qǐng)的最小資源存谎,默認(rèn)值為1024MB
- yarn.scheduler.maximum-allocation-mb:調(diào)度時(shí)一個(gè)container能夠申請(qǐng)的最大資源拔疚,默認(rèn)值為8192MB
總結(jié)
在client模式下,AM對(duì)應(yīng)的Container內(nèi)存由spark.yarn.am.memory加上spark.yarn.am.memoryOverhead來(lái)確定既荚,executor加上spark.yarn.executor.memoryOverhead的值之后確定對(duì)應(yīng)Container需要申請(qǐng)的內(nèi)存大小稚失,driver和executor的內(nèi)存加上spark.yarn.driver.memoryOverheadspark.yarn.executor.memoryOverhead的值之后再乘以0.54確定storage memory內(nèi)存大小。在YARN中固以,Container申請(qǐng)的內(nèi)存大小必須為yarn.scheduler.minimum-allocation-mb的整數(shù)倍墩虹。
下面這張圖展示了Spark on YARN 內(nèi)存結(jié)構(gòu),圖片來(lái)自How-to: Tune Your Apache Spark Jobs (Part 2):
至于cluster模式下的分析憨琳,請(qǐng)參考上面的過(guò)程诫钓。希望這篇文章對(duì)你有所幫助!