在TARN中,資源管理由RescoueceManager和NodeManager共同完成,其中,Resourcemanager中的調度器負責資源分配,而NodeManager則負責資源的供給和隔離。
ResourceManager將某個Nodemanager上資源分配給任務(這就是所謂的資源調度)后,NodeManager需按照要求為任務提供相應的資源,甚至保證這些資源應具有獨占性,為任務運行提供基礎保證,這就是所謂的資源隔離。
基於以上考慮,YARN允許用戶配置每、個節點上可用的物理內存資源,注意,這里是“可用的”,因為一個節點上的內存會被若干個服務共享,比如一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是自己可以使用的,配置參數如下:
(1)yarn.nodemanager.resource.memory-mb
表示該節點上YARN可使用的物理內存總量,默認是8192MB,注意,如果你的節點內存資源不夠8G,則需要調減小這個值,而YARN不會智能的探測節點的物理內存總量。
上邊這兩個參數是有關聯的,如果yarn.nodemanager.resource.detect-hardware-capabilities 為true並且yarn.nodemanager.resource.memory-mb 為-1,那么
yarn.nodemanager.resource.memory-mb是自動計算,如果不是則yarn.nodemanager.resource.memory-mb=8G(默認)
(2)yarn.scheduler.minimum-allocation-mb
單個任務可申請的最少內存,默認時1024M,如果一個任務申請的物理內存量少於該值,則該對應的值減少位這個數
(3)yarn.scheduler.maximum-allocation-mb
單個任務可申請的最大內存,默認時8192M
(4)yarn.nodemanager.pmem-check-enabled true
是否啟動一個線程檢查每個任務正在使用的物理內存量,如果任務超出分配值,直接將他殺掉,默認是True
(5)yarn.nodemanager.vmem-check-enabled true
是否啟動一個線程檢查每個任務正在使用的虛擬內存量,如果任務超出分配值,直接將他殺掉,默認是True
(6)yarn.nodemanager.vmem-pmem-ratio 2.1
任務每使用1M的物理內存,最多可使用的虛擬內存量
目前的CPU被划分成虛擬CPU(CPU virtual Core),這里的虛擬CPU是YARN自己引入的概念,初衷是,考慮到不同節點的CPU性能可能不同,每個CPU具有的計算能力也是不一樣的,比如某個物理CPU的計算能力可能是另外一個物理CPU的2倍,這時候,你可以通過為第一個物理CPU多配置幾個虛擬CPU彌補這種差異。用戶提交作業的時候,可以指定每個任務需要的虛擬CPU個數。在YARN中,CPU相關配置參數如下:
(7) yarn.nodemanager.resource.cpu-vcores 12
表示該節點上YARN可使用的虛擬CPU個數,默認是8,目前推薦將該值設置位與物理CPU核數數目相同。如果物理CPU核數不夠8,則需要調小這個值,而YARN不 會智能的探測物理CPU總數。
(8) yarn.scheduler.minimum-allocation-vcores 1
單個任務可申請的最小CPU個數,默認是1,如果一個任務申請的CPU個數小於該數,則將該數改為這個數。
(9) yarn.scheduler.maximum-allocation-vcores 4
單個任務可申請的最大CPU個數,默認是4
container: 容器個數的判別標准有兩個維度
一個是物理內存,一個是CPU
memory 16c~4c
vcores 12c~3c
總結: yarn的在調優時候要綜合考慮CPU和內存的分配,盡量保證不要空出多余的資源,假如container總內存30,container最小2G,總vcore8 container 最小1c
那么我們內存可以啟動最多15個container,cpu最多啟動8個container,最終可以啟動8個container,會有相當多的內存沒有用到。所以生產上的調優配置需要綜合考量內存和 CPU的配比。