nodemanager/ratio
yarn.nodemanager.resource.memory-mb
- 集群中某個計算節點分配給nodemanager的最大可用內存,這個最大可用內存不是該節點最大內存,而是該節點最大內存划分出來的給nodemanager使用的內存,
該配置項在集群啟動后,無法動態改變。 - 比如一個節點最大內存為128G,計划給nodemanager80%的內存資源,則設置yarn.nodemanager.resource.memory-mb為103G,其余25G用作該節點其他資源調配,保證這個計算節點正常運行。
- 這個配置默認是8G,集群並不會主動檢測這個可用內存,如果節點內存資源少於8G,需要將這個配置項設置成實際的資源,如果不配置,集群會按照8G的資源調配,這樣會導致可能同時創建過多的container而OOM。
yarn.nodemanager.vmem-pmem-ratio
-
虛擬內存的比例,默認是2.1,即每使用1G物理內存,分配2.1的虛擬內存。
-
該配置項在集群啟動后,無法動態改變。
-
虛擬內存不夠也會報oom,在nodemanager的日志中可以看到。
- 虛擬內存是個what ???
- 現在還不是很了解這個,只是有時會看到日志報虛擬內存OOM,推薦做法就是將這個值調大,
- 但至於多少合理,有待研究,畢竟不可能無上限
resourceManager
yarn.scheduler.minimum-allocation-mb
- 這個配置時用來指定單個容器(container)可申請的最小內存資源,
- 如果申請的內存資源小於這個配置項的值,則按最小值分配。(有的商業版禁止申請小於這個值的內存資源)
- 這個配置是會影響到單個節點上container個數的,所以比較重要。有下面的經驗推薦值:
| Total RAM per Node | Recommended Minimum Container Size | |
| ---- | ---- | ---- |
| Less than 4 GB | 256 MB | |
| Between 4 GB and 8 GB | 512 MB | |
| Between 8 GB and 24 GB | 1024 MB | |
| Above 24 GB | 2048 MB | |
參考來自:https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.0.6.0/bk_installing_manually_book/content/rpm-chap1-11.html
注:但畢竟是推薦值,其實還是要根據實際情況,比如說這個推薦值的前提是計算節點就是計算節點,跑的其他進程少,可以這么干,像我們這次是單節點,整個集群所有服務都在一個節點上,即使是8G,也肯定不能用1024,512都有壓力…
yarn.scheduler.maximum-allocation-mb
- 單個容器(container)可申請的最大內存資源,應用在運行時申請的內存不能超過這個配置項值,
- 因為這個配置項是指定一個container最大的內存,實際分配內存時並不是按照這個配置項分配,所以這個配置項可以配置成和nodemanager的可用內存(yarn.nodemanager.resource.memory-mb)一樣即可,這樣的話,意味着只要這個節點的nodemanager可用內存哪怕只夠跑一個container,這個container也是可以啟動的。
- 如果這個參數配置的比nodemanager的可用內存(yarn.nodemanager.resource.memory-mb)小,那么可能出現這個節點總內存即使足夠提供所需內存的,但卻無法啟動container的情況。
map/reduce
mapreduce.map.memory.mb
- 指定map任務時申請的內存,是一個精確值,不是范圍值,這就是一個map真實用到內存的值了。
- 這個配置是可以在腳本或代碼中動態申請的,但是取值范圍必須是在container內存大小值之間。
- 即 yarn.scheduler.minimum-allocation-mb < mapreduce.map.memory.mb < yarn.scheduler.maximum-allocation-mb
- 比如在hive中申請:set mapreduce.map.memory.mb=4096;
- 實際上,我們現在大部分腳本在執行前都是動態申請一下的。只要在container大小以內。
遺留問題:
這個值該如何配置。還是說不需要配置,只需要把控container的大小內存,有開發人員根據實際情況申請
mapreduce.reduce.memory.mb
- 和map的是對應的,指定reduce任務執行時申請的內存,是一個精確值,不是范圍值。
- 可以在腳本或者代碼中動態申請,取值范圍必須是在container內存大小值之間。
- 配置時建議這個值是map的2倍,這個可能是要考慮到多個map后數據可能會有一個reduce處理,根據實際需要來看。
mapreduce.map.java.opts
- 在map階段的yarnchild進程執行jvm參數, 必須小於mapreduce.map.memory.mb
- 一般是 0.8 * mapreduce.map.memory.mb
mapreduce.reduce.java.opts
- 在reduce階段的yarnchild進程執行jvm參數, 必須小於mapreduce.reduce.memory.mb
- 一般是 0.8 * mapreduce.reduce.memory.mb
ApplicationMaster
yarn.app.mapreduce.am.resource.mb
- 指定appMaster的運行內存,默認是1.5g。
- appMaster也是運行在container中,所以如果修改了yarn.scheduler.maximum-allocation-mb,就要注意修改這個配置
- 這個值必須小於 yarn.scheduler.maximum-allocation-mb才可以啟動appMaster
原文鏈接:https://blog.csdn.net/kyle0349/article/details/82084980