【轉】yarn中container、mr內存的配置,控制container個數


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM