Container 是 YARN 中基本的處理單元,它是對內存、CPU等計算的封裝。總的來講,每一個core每塊硬盤 分配2個 container,能得到較好的集羣利用率。java
1. 肯定可用內存大小。node
對於每臺主機來講,YARN 和 MapReduce 能用內存大小是除去預留給系統的內存(若是還有 HBase,還要相應留內存給它)後的大小,即:app
YARN 可用內存(RAM for YARN) = 總內存(Total RAM) - 系統預留(Reserved for System) - HBase預留(Reserved for HBase)
如下是預留內存大小的推薦表spa
每臺 Node 的總內存 | 給系統預留的內存 | 給 HBase 預留的內存 |
4 GB | 1 GB | 1 GB |
8 GB | 2 GB | 1 GB |
16 GB | 2 GB | 2 GB |
24 GB | 4 GB | 4 GB |
48 GB | 6 GB | 8 GB |
64 GB | 8 GB | 8 GB |
72 GB | 8 GB | 8 GB |
96 GB | 12 GB | 16 GB |
128 GB | 24 GB | 24 GB |
256 GB | 32 GB | 32 GB |
512 GB | 64 GB | 64 GB |
2. 計算每一個 Node 最大容許的 container 的數量code
最大container 數量 = min (2*CORES, 1.8*DISKS, (總的可用內存) / MIN_CONTAINER_SIZE)
上面 CORES 指的是核數,DISKS 是硬盤數, MIN_CONTAINER_SIZE 是 container 最小的內存大小。xml
MIN_CONTAINER_SIZE 推薦表:blog
每一個 Node 總內存 | 推薦的 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 |
3. 計算 RAM-per-Container內存
RAM-per-container = max(MIN_CONTAINER_SIZE, (總內存) / containers))it
經過上面計算獲得的值,能夠按下表進行配置io
配置文件 | 配置項 | 數值計算公式 |
yarn-site.xml | yarn.nodemanager.resource.memory-mb | = containers * RAM-per-container |
yarn-site.xml | yarn.scheduler.minimum-allocation-mb | = RAM-per-container |
yarn-site.xml | yarn.scheduler.maximum-allocation-mb | = containers * RAM-per-container |
mapred-site.xml | mapreduce.map.memory.mb | = RAM-per-container |
mapred-site.xml | mapreduce.reduce.memory.mb | = 2 * RAM-per-container |
mapred-site.xml | mapreduce.map.java.opts | = 0.8 * RAM-per-container |
mapred-site.xml | mapreduce.reduce.java.opts | = 0.8 * 2 * RAM-per-container |
yarn-site.xml (check) | yarn.app.mapreduce.am.resource.mb | = 2 * RAM-per-container |
yarn-site.xml (check) | yarn.app.mapreduce.am.command-opts | = 0.8 * 2 * RAM-per-container |
下面以單臺節點具備 12 core,48G內存, 12 塊硬盤 舉例
(1)預留內存(Reserved RAM) = 6G(系統) + 8G(HBase)
(2)MIN_CONTAINER_SIZE = 2G
(3)container_num = min (2*12, 1.8* 12, (48-6-8)/2) = min (24, 21.6, 17) = 17
(4)RAM-per-container = max (2, (48-6-8)/17) = max (2, 2) = 2
得出以下配置項的值
配置項 | 計算獲得的值 |
yarn.nodemanager.resource.memory-mb | = 17 * 2 = 34*1024 MB |
yarn.scheduler.minimum-allocation-mb | = 2*1024 MB |
yarn.scheduler.maximum-allocation-mb | = 17 * 2 = 34*1024 MB |
mapreduce.map.memory.mb | = 2*1024 MB |
mapreduce.reduce.memory.mb | = 2 * 2 = 4*1024 MB |
mapreduce.map.java.opts | = 0.8 * 2 = 1.6*1024 MB |
mapreduce.reduce.java.opts | = 0.8 * 2 * 2 = 3.2*1024 MB |
yarn.app.mapreduce.am.resource.mb | = 2 * 2 = 4*1024 MB |
yarn.app.mapreduce.am.command-opts | = 0.8 * 2 * 2 = 3.2*1024 MB |
注意:
1. 改變 yarn.scheduler.minimum-allocation-mb 或 yarn.scheduler.minimum-allocation-mb,能夠改變單個 Node 中 container 的數量
2. 若是 Node 具備較高的 RAM,可是較少的 cores 或 disks,能夠減小 yarn.scheduler.minimum-allocation-mb 和 yarn.scheduler.minimum-allocation-mb 的值,以釋放更多的內存給其它應用。