YARN
自從hadoop2.0之后, 我們可以使用apache yarn 來對集群資源進行管理。yarn把可以把資源(內存,CPU)以Container的方式進行划分隔離。YARN會管理集群中所有機器的可用計算資源. 基於這些資源YARN會調度應用(比如MapReduce)發來的資源請求, 然后YARN會通過分配Container來給每個應用提供處理能力, Container(容器)是YARN中處理能力的基本單元, 是對內存, CPU等的封裝(容器)。
ResourceManager:以下簡稱RM。YARN的中控模塊,負責統一規划資源的使用。
NodeManager:以下簡稱NM。YARN的資源結點模塊,負責啟動管理container。
ApplicationMaster:以下簡稱AM。YARN中每個應用都會啟動一個AM,負責向RM申請資源,請求NM啟動container,並告訴container做什么事情。
Container:資源容器。YARN中所有的應用都是在container之上運行的。AM也是在container上運行的,不過AM的container是RM申請的。
了解上面的基本概念之后,就可以開始優化集群的配置了
配置NM的注冊資源
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>30</value>
<discription>每個nodemanager可分配的cpu總核數</discription>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>122880</value>
<discription>每個nodemanager可分配的內存總量</discription>
</property>
優化建議:
1. cpu核數=邏輯核數-其他應用數(datanode?work?zk?等)
cat /proc/cpuinfo | grep "processor" | wc -l
可以查看集群的邏輯核數
2. 內存建議是CPU的整數倍,給系統預留好足夠用的內存
ApplicationMaster配置
<property>
<name>yarn.app.mapreduce.am.resource.cpu-vcores</name>
<value>1</value>
</property>
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>4096</value>
<discription>ApplicationMaster的占用的內存大小</discription>
</property>
優化建議
1. cpu和內存比例和 nm的分配比例保持一致
Container 配置優化
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>16384</value>
<discription>單個任務可申請最大內存,默認8192MB</discription>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
<discription>單個任務可申請的最多虛擬CPU個數</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
<discription>單個任務可申請的最小虛擬CPU個數</discription>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>4096</value>
<discription>container最小可申請的內存</discription>
</property>
優化建議
1. 在調度器中,很多資源計算部分會轉化為這個最小值的N倍進行計算。所以,設定可分配內存等資源的時候,最好是剛好為這個最小值的倍數
2. cpu/內存比例保持一致
3. YARN采用了線程監控的方法判斷任務是否超量使用內存,一旦發現超量,則直接將其殺死。由於Cgroups對內存的控制缺乏靈活性(即任務任何時刻不能超過內存上限,如果超過,則直接將其殺死或者報OOM),而Java進程在創建瞬間內存將翻倍,之后驟降到正常值,這種情況下,采用線程監控的方式更加靈活(當發現進程樹內存瞬間翻倍超過設定值時,可認為是正常現象,不會將任務殺死),因此YARN未提供Cgroups內存隔離機制來控制容器。
mapreduce參數設置
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
<discription>map的內存大小</discription>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx3072M</value>
<discription>用戶設定的map/reduce階段申請的container的JVM參數。最大堆設定要比申請的內存少一些,用於JVM的非堆部分使用0.80-0.85建議</discription>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx6144M</value>
</property>
優化參考
1. 如果集群主要使用mr進行計算,那么建議map的內存和cpu和容器最小的相等。
2. 一個容器里面最多跑幾個map?yarn.scheduler.maximum-allocation-mb/mapreduce.map.memory.mb=4
問題來了
如何控制一個nodemanager里Container的數量呢?
<property>
<name>yarn.scheduler.fair.assignmultiple</name>
<value>true</value>
<discription>是否允許NodeManager一次分配多個容器</discription>
</property>
<property>
<name>yarn.scheduler.fair.max.assign</name>
<value>20</value>
<discription>如果允許一次分配多個,一次最多可分配多少個,這里按照一個最小分配yarn.scheduler.minimum-allocation-mb4gb來計算總共內存120/4=30給20即可</discription>
</property>
Fari Scheduler 配置案例
24個節點每個節點120GB內存30個邏輯CPU
<?xml version="1.0"?>
<allocations>
<queue name="mapreduce">
<minResources>368640 mb,90 vcores</minResources><!--3 nodes-->
<maxResources>2334720 mb,570 vcores</maxResources><!--19 nodes-->
<maxRunningApps>70</maxRunningApps>
<weight>5</weight>
<queue name="vipquery">
<minResources>122880 mb,30 vcores</minResources><!--1 nodes-->
<maxResources>1966080 mb,480 vcores</maxResources><!--16 nodes-->
<maxRunningApps>20</maxRunningApps>
<weight>8</weight>
</queue>
<queue name="hive">
<minResources>122880 mb,30 vcores</minResources><!--1 nodes-->
<maxResources>1966080 mb,480 vcores</maxResources><!--16 nodes-->
<maxRunningApps>20</maxRunningApps>
<weight>7</weight>
</queue>
<queue name="hadoop">
<minResources>122880 mb,30 vcores</minResources><!--1 nodes-->
<maxResources>1966080 mb,480 vcores</maxResources><!--16 nodes-->
<maxRunningApps>30</maxRunningApps>
<weight>6</weight>
</queue>
</queue>
<queue name="default">
<minResources>122880 mb,30 vcores</minResources><!--1 nodes-->
<maxResources>614400 mb,150 vcores</maxResources><!--5 nodes-->
<maxRunningApps>20</maxRunningApps>
<weight>1</weight>
</queue>
</allocations>
總結
通過合理的配置Yarn可以有效的控制,資源搶占,還有峰值並發等問題。
