在Hadoop2.0中, YARN负责管理MapReduce中的资源(内存, CPU等)并且将其打包成Container. 这样可以精简MapReduce, 使之专注于其擅长的数据处理任务, 将无需考虑资源调度. 如下图所示 YARN会管理集群中所有机器的可用计算资源. 基于这些资源YARN会调度应用(比如
在Hadoop2.0中, YARN负责管理MapReduce中的资源(内存, CPU等)并且将其打包成Container. 这样可以精简MapReduce, 使之专注于其擅长的数据处理任务, 将无需考虑资源调度. 如下图所示
YARN会管理集群中所有机器的可用计算资源. 基于这些资源YARN会调度应用(比如MapReduce)发来的资源请求, 然后YARN会通过分配Container来给每个应用提供处理能力, Container是YARN中处理能力的基本单元, 是对内存, CPU等的封装.
本文中假设集群中每个节点的配置为48G内存, 12个硬盘, 2个hex core CPU(12 核).
1. 配置YARN
在Hadoop集群中, 平衡内存, CPU等的使用很重要, 这样才能避免整个集群的计算能力不会因为某种资源而受限. 根据Hortonworks的推荐, 每个硬盘和核1-2个Container能够达到最好的集群使用平衡. 如果集群的每个节点有12个硬盘和12个核, 那么每个节点上最好最多20个Container.
因为每个节点有48G内存, 我们为操作系统保留部分内存, 所以分配40G内存给YARN, 8G留给操作系统. 下面配置的是每个节点上YARN可以使用的最大内存.
在yarn-site.xml中
yarn.nodemanager.resource.memory-mb
40960
Copy after login
然后需要配置如何把这些资源分配给Container, 可以配置分配给Container的最小内存, 因为我们允许每个节点最多20个Container, 所以每个Container的内存为40G / 20 = 2G
在yarn-site.xml中
yarn.scheduler.minimum-allocation-mb
2048
Copy after login
2. ?配置MapReduce2
MapReduce2构建在YARN的基础之上, 使用YARN的Container来调度和运行其map和reduce任务.
在配置YARN上的MapReduce资源使用时, 需要考虑:
- 每个Map和Reduce任务的物理内存限制
- 每个任务的JVM堆栈大小
- 每个任务的虚拟内存
可以设置每个map和reduce任务的最大内存, 该值应该大于等于Container的最小内存. 比如前面我们设置每个Container的最小内存(yarn.scheduler.minimum-allocation-mb)为2GB, 所以我们可以设置map任务的内存为4GB, reduce任务的内存为8GB:
在mapred-site.xml中
mapreduce.map.memory.mb
4096
mapreduce.reduce.memory.mb
8192
Copy after login
每个Container会为每个map和reduce任务运行一个JVM, JVM的堆栈大小应该小于map和reduce的内存大小:
在mapred-site.xml中
mapreduce.map.java.opts
-Xmx3072m
mapreduce.reduce.java.opts
-Xmx6144m
Copy after login
前面设置的是map和reduce任务可以使用的物理内存, 而虚拟内存(物理内存+paged memory)的上限是由每个Container的虚拟内存比例决定的, 默认值为2.1:
在yarn-site.xml中:
yarn.nodemanager.vmem-pmem-ratio
2.1
Copy after login
根据之前的所有设置, 每个map任务的内存分配为
- 物理内存 = 4GB
- map任务的Container的JVM堆栈 = 3GB
- 虚拟内存大小 = 4 * 2.1 = 8.4GB
在YARN和MapReduce2中, 除此之外没有其他的map和reduce任务的资源预配置. 整个集群可以根据作业的需要动态的分配map和reduce, 比如在本例中, YARN会配置最多10(40/4)个mapper或者5(40/8)个reducer, 或者是其他合适的组合.
参考文献:
[1].?How to Plan and Configure YARN and MapReduce 2 in HDP 2.0
原文地址:配置Hadoop2.0的内存资源, 感谢原作者分享。