spark on yarn的未解之谜
對spark on yarn研究比較多的朋友都應該發現過你明明給executor申請了1GB內存,結果發現該executor占用了yarn的2GB內存。
其實,對于spark的driver和executor在申請內存的時候有個計算公式:
spark.yarn.am.memoryOverhead? 除了指定的申請資源外額外申請(yarn-client模式): AM?memory?* 0.10,?with?minimum?of?384spark.driver.memoryOverhead? 除了指定的申請資源外,額外申請: driverMemory?* 0.10,?with?minimum?of?384spark.executor.memoryOverhead? 除了指定的申請資源外,額外申請: executorMemory?* 0.10,?with?minimum?of?384由于1GB*0.10才100MB,所以會是1GB+384MB<2GB,不符合預期。實際上這個還依賴于yarn的內存調度粒度。resourcemanager的參數:
最小值
<property> <name>yarn.scheduler.minimum-allocation-mb</name> <value>1024</value> </property>
最大值
默認yarn的調度最小單元就是1GB,所以結果就是使你原本申請1GB(+額外內存)的內存變為了2GB。
讀到這里估計很多同學該說了,這個我了解但是貌似跟yarn最大并行度沒什么關系呀?別急!
重磅來襲~
其實,yarn為了很方便控制在運行的任務數,也即是處于running狀態任務的數目,提供了一個重要的參數配置,但是很容易被忽略。
<property> <name>yarn.scheduler.capacity.maximum-am-resource-percent</name> <value>0.1</value> <description>?Maximum percent of resources in the cluster which can?be?used?to?run application masters i.e. controls?number?of concurrent running applications. </description> </property>配置文件是:hadoop-2.7.4/etc/hadoop/capacity-scheduler.xml
參數含義很明顯就是所有AM占用的總內存數要小于yarn所管理總內存的一定比例,默認是0.1。
也即是yarn所能同時運行的任務數受限于該參數和單個AM的內存。
那么回歸本話題,可以看看該同學所能申請的AM總內存的大小是:
400GB*0.1=40GB。
但是,該同學配置的yarn的內存調度最小單元是4GB,這樣雖然他申請的任務AM每個都是1GB,但是由于調度單位是4GB,所以在這里實際內存就是4GB,剛好10個任務40GB,也就不能提交第11個任務了。
所以需要將調度內存調到默認值1GB,其實一般情況下沒必要調整,然后將AM總內存占比提高,比如1,即可。
總結
以上是生活随笔為你收集整理的spark on yarn的未解之谜的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: npm 安装报错 rollbackFai
- 下一篇: yarn集群启动时,并不自动启动reso