確定Hadoop內存配置設置
YARN和MapReduce的總可用RAM應考慮保留內存。Reserved Memory是系統進程和其他Hadoop進程(例如HBase)所需的RAM。
1. 保留內存
保留內存=為堆棧內存保留+為HBase內存保留(如果HBase在同一節點上)
保留的內存建議:
每個節點的總內存 | 推薦的預留系統內存 | 推薦的預留HBase內存 |
---|---|---|
4GB | 1GB | 1GB |
8GB | 2GB | 1GB |
>=16GB | 總內存1/8 | 總內存1/8 |
2. 確定每個節點允許的最大容器數。
容器數量= min(2 * CORES,1.8 * DISKS,(總可用RAM)/ MIN_CONTAINER_SIZE)
其中MIN_CONTAINER_SIZE是最小容器大小(在RAM中)。此值取決於可用的RAM量 - 在較小的內存節點中,最小容器大小也應該更小。下表概述了建議值:
每個節點的總RAM | 建議的最小容器尺寸 |
---|---|
小於4 GB | 256 MB |
介於4 GB和8 GB之間 | 512 MB |
介於8 GB和24 GB之間 | 1024 MB |
超過24 GB | 2048 MB |
3. 確定每個容器的RAM量:
RAM-per-container = max(MIN_CONTAINER_SIZE,(總可用RAM)/容器數量))
配置文件 | 配置設置 | 價值計算 |
---|---|---|
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 |
4. 在YARN上配置MapReduce內存設置
MapReduce在YARN之上運行,並利用YARN Containers來安排和執行Map and Reduce任務。在YARN上配置MapReduce資源利用率時,需要考慮三個方面:
-
每個Map和Reduce任務的物理RAM限制。
-
每個任務的JVM堆大小限制。
-
每個任務將接收的虛擬內存量。
您可以為每個Map和Reduce任務定義最大內存量。由於每個Map和Reduce任務都將在一個單獨的Container中運行,因此這些最大內存設置應等於或大於YARN最小Container分配。
對於上一節中使用的示例群集(48 GB RAM,12個磁盤和12個核心),Container的最小RAM(yarn.scheduler.minimum-allocation-mb)= 2 GB。因此,我們將為Map任務容器分配4 GB,為Reduce任務容器分配8 GB。
在 mapred-site.xml:
<name> mapreduce.map.memory.mb </ name>
<value> 4096 </ value>
<name> mapreduce.reduce.memory.mb </ name>
<value> 8192 </ value>
每個Container都將運行JVM以執行Map和Reduce任務。JVM堆大小應設置為低於Map和Reduce Containers的值,以便它們在YARN分配的Container內存的範圍內。
在 mapred-site.xml:
<name> mapreduce.map.java.opts </ name>
<value> -Xmx3072m </ value>
<name> mapreduce.reduce.java.opts </ name>
<value> -Xmx6144m </ value>
上述設置配置Map和Reduce任務將使用的物理RAM的上限。每個Map和Reduce任務的虛擬內存(物理+分頁內存)上限由允許每個YARN Container的虛擬內存比確定。此比率使用以下配置屬性設置,默認值為2.1:
在 yarn-site.xml:
<name> yarn.nodemanager.vmem-pmem-ratio </ name>
<value> 2.1 </ value>
通過我們示例集群上的上述設置,每個Map任務將接收以下內存分配:
分配的物理RAM總量= 4 GB
Map任務Container中的JVM堆空間上限= 3 GB
虛擬內存上限= 4 * 2.1 = 8.2 GB
例子
群集節點具有12個CPU核心,48 GB RAM和12個磁盤。
保留內存= 6 GB保留用於系統內存+(如果是HBase)8 GB用於HBase
最小容器大小= 2 GB
1. 如果沒有HBase:
容器數量= min(2 * 12,1.8 * 12,(48-6)/ 2)= min(24,21.6,21)= 21
RAM-per-container = max(2,(48-6)/ 21)= max(2,2)= 2
組態 | 價值計算 |
---|---|
yarn.nodemanager.resource.memory-mb | = 21 * 2 = 42 * 1024 MB |
yarn.scheduler.minimum.allocation-mb | = 2 * 1024 MB |
yarn.scheduler.maximum.allocation-mb | = 21 * 2 = 42 * 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 |
2. 如果包含HBase:
容器數量= min(2 * 12,1.8 * 12,(48-6-8)/ 2)= min(24,21.6,17)= 17
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 |
確定Hadoop內存配置設置