hadoop yarn running beyond physical memory used

 

總是報物理內存越界,kill container,而後把yarn.scheduler.minimum-allocation-mb設成2048就行了

跟這個yarn.nodemanager.pmem-check-enabled參數應該也有關係

在這篇文章中獲得啓發:http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-memory-cpu-scheduling/
php

調度和隔離

Hadoop YARN同時支持內存和CPU兩種資源的調度(默認只支持內存,若是想進一步調度CPU,須要本身進行一些配置),本文將介紹YARN是如何對這些資源進行調度和隔離的。html

在YARN中,資源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的調度器負責 資源的分配,而NodeManager則負責資源的供給和隔離。ResourceManager將某個NodeManager上資源分配給任務(這就是所 謂的「資源調度」)後,NodeManager需按照要求爲任務提供相應的資源,甚至保證這些資源應具備獨佔性,爲任務運行提供基礎的保證,這就是所謂的 資源隔離。node

內存資源的多少會會決定任務的生死,若是內存不夠,任務可能會運行失敗;相比之下,CPU資源則不一樣,它只會決定任務運行的快慢,不會對生死產生影響。app

內存配置參數

基於以上考慮,YARN容許用戶配置每一個節點上可用的物理內存資源,注意,這裏是「可用的」,由於一個節點上的內存會被若干個服務共享,好比一部分給YARN,一部分給HDFS,一部分給HBase等,YARN配置的只是本身可使用的,配置參數以下oop

(1)yarn.nodemanager.resource.memory-mb性能

表示該節點上YARN可以使用的物理內存總量,默認是8192(MB),注意,若是你的節點內存資源不夠8GB,則須要調減少這個值,而YARN不會智能的探測節點的物理內存總量。spa

(2)yarn.nodemanager.vmem-pmem-ratio操作系統

任務每使用1MB物理內存,最多可以使用虛擬內存量,默認是2.1。線程

(3) yarn.nodemanager.pmem-check-enabledhtm

是否啓動一個線程檢查每一個任務正使用的物理內存量,若是任務超出分配值,則直接將其殺掉,默認是true。

(4) yarn.nodemanager.vmem-check-enabled

是否啓動一個線程檢查每一個任務正使用的虛擬內存量,若是任務超出分配值,則直接將其殺掉,默認是true。

(5)yarn.scheduler.minimum-allocation-mb

單個任務可申請的最少物理內存量,默認是1024(MB),若是一個任務申請的物理內存量少於該值,則該對應的值改成這個數。

(6)yarn.scheduler.maximum-allocation-mb

單個任務可申請的最多物理內存量,默認是8192(MB)。

默認狀況下,YARN採用了線程監控的方法判斷任務是否超量使用內存,一旦發現超量,則直接將其殺死。因爲Cgroups對內存的控制缺少靈活性 (即任務任什麼時候刻不能超過內存上限,若是超過,則直接將其殺死或者報OOM),而Java進程在建立瞬間內存將翻倍,以後驟降到正常值,這種狀況下,採用 線程監控的方式更加靈活(當發現進程樹內存瞬間翻倍超過設定值時,可認爲是正常現象,不會將任務殺死),所以YARN未提供Cgroups內存隔離機制。

CPU配置參數

在YARN中,CPU資源的組織方式仍在探索中,目前(2.2.0版本)只是一個初步的,很是粗粒度的實現方式,更細粒度的CPU劃分方式已經提出來了,正在完善和實現中。

目前的CPU被劃分紅虛擬CPU(CPU virtual Core),這裏的虛擬CPU是YARN本身引入的概念,初衷是,考慮到不一樣節點的CPU性能可能不一樣,每一個CPU具備的計算能力也是不同的,好比某個 物理CPU的計算能力多是另一個物理CPU的2倍,這時候,你能夠經過爲第一個物理CPU多配置幾個虛擬CPU彌補這種差別。用戶提交做業時,能夠指 定每一個任務須要的虛擬CPU個數。在YARN中,CPU相關配置參數以下:

(1)yarn.nodemanager.resource.cpu-vcores

表示該節點上YARN可以使用的虛擬CPU個數,默認是8,注意,目前推薦將該值設值爲與物理CPU核數數目相同。若是你的節點CPU核數不夠8個,則須要調減少這個值,而YARN不會智能的探測節點的物理CPU總數。

(2) yarn.scheduler.minimum-allocation-vcores

單個任務可申請的最小虛擬CPU個數,默認是1,若是一個任務申請的CPU個數少於該數,則該對應的值改成這個數。

(3)yarn.scheduler.maximum-allocation-vcores

單個任務可申請的最多虛擬CPU個數,默認是32。

默認狀況下,YARN是不會對CPU資源進行調度的,你須要配置相應的資源調度器讓你支持

默認狀況下,NodeManager不會對CPU資源進行任何隔離,你能夠經過啓用Cgroups讓你支持CPU隔離。

因爲CPU資源的獨特性,目前這種CPU分配方式仍然是粗粒度的。舉個例子,不少任務多是IO密集型的,消耗的CPU資源很是少,若是此時你爲它 分配一個CPU,則是一種嚴重浪費,你徹底可讓他與其餘幾個任務公用一個CPU,也就是說,咱們須要支持更粒度的CPU表達方式。

借鑑亞馬遜EC2中CPU資源的劃分方式,即提出了CPU最小單位爲EC2 Compute Unit(ECU),一個ECU表明至關於1.0-1.2 GHz 2007 Opteron or 2007 Xeon處理器的處理能力。YARN提出了CPU最小單位YARN Compute Unit(YCU),目前這個數是一個整數,默認是720,由參數yarn.nodemanager.resource.cpu-ycus-per- core設置,表示一個CPU core具有的計算能力(該feature在2.2.0版本中並不存在,可能增長到2.3.0版本中),這樣,用戶提交做業時,直接指定須要的YCU即 可,好比指定值爲360,表示用1/2個CPU core,實際表現爲,只使用一個CPU core的1/2計算時間。注意,在操做系統層,CPU資源是按照時間片分配的,你能夠說,一個進程使用1/3的CPU時間片,或者1/5的時間片

相關文章
相關標籤/搜索