看到一篇写hadoop2.x版本配置的讲解文章,感觉很不错,在此翻译一下。原文连接:https://hortonworks.com/blog/how-to-plan-and-configure-yarn-in-hdp-2-0/
作为Hadoop2.x的一部分,Yarn拥有MapReduce(hadoop1.x)中的资源管理功能并对齐进行打包,以便新引擎可以使用它们。这也简化了MapReduce,使其只进行数据处理。使用Yarn可以在Hadoop中运行多个程序,所有程序都共享一个公共资源管理。
在这篇文章中,我们将介绍如何在hdoop2.x集群中规划和配置处理能力。这将包括Yarn和MapReduce2。我们将使用一个示例物理集群,它的从节点有48GB的运行内存,12个磁盘和2个CPU核心。
Yarn会考虑集群中所有机器的可用计算资源。Yarn将协商来自集群中运行程序的资源请求。然后,Yarn通过分配容器为应用程序提供处理能力。Container是Yarn中处理能力的基本单元,是资源(cpu,内存等)的封装。
配置Yarn
在Hadoop集群中,平衡内存、cpu和磁盘等资源非常重要,这样处理能力不受任何一个集群资源的限制。作为一般的建议,我们发现每个磁盘和核心允许1-2个容器可以为集群利用提供最佳平衡。因此,对于有12个磁盘和12个核心的实例集群,我们允许为每个节点分配20个最大容器。
集群中每台机器有48G的内存,部分内存应保留用于操作系统。在每个节点上,我们将为Yarn分配40G的内存,为操作系统预留8G。以下属性设置Yarn可在节点上使用的最大内存:
yarn-site.xml
<name>
yarn.nodemanager.resource.memory-mb
</name>
<value>
40960
</value>
下一步是提供如何分解Container中可用资源总量的指南。可以通过指定为Container分配的最小内存(默认是1GB)执行此操作。我们希望最多允许20个Container。因此,每个Container最小2G(40/20).
yarn-site.xml
<name>
yarn.scheduler.minimum-allocation-mb
</name>
<value>
2048
</value>
通过这样配置,Yarn将分配内存大于yarn.scheduler.minimum-mb的Container。这里,没有配置Container最大可用内存(默认是8G)。
配置MapReduce
MapReduce运行在Yarn之上,并利用Yarn的容器分配和运行Map和Reduce任务。
在Yarn上配置MapReduce资源利用时,有三个方面需要考虑:
- 每个Map和Reduce任务物理内存的限制
- 每个任务的JVM堆大小限制
- 每个任务将获得的虚拟内存量
我们可以定义每个Map和Reduce任务所占用的最大内存。由于每个Map和Reduce任务运行在单独的Container中,因此最大内存的设定应该等于或大于Yarn中最小Container分配,等于或小于最大Container分配。
在实例集群中,我们配置了最小2GB的Container。因此,我们将为Map任务分配4G,为Reduce任务分配8G(map*2)。
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内存,以便它们在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任务使用的物理内存上限,每个Map/Reduce任务的虚拟内存上限由允许每个Container的虚拟内存比确定。它由以下配置,默认值是2.1:
yarn-site.xml
<name>
yarn.nodemanager.vmem-pmem-ratio
</name>
<value>
2.1
</value>
通过以上的配置,每个Map任务将获得以下的内存分配:
- 物理内存:4GB
- Map任务Container中的JVM堆空间上限:3GB
- 虚拟内存上限:4*2.1=8.4G
通过配置Yarn和MapRedue,不需要再为Map和Reduce任外务预先配置静态slot。整个集群可动态进行资源分配。在实例集群中,Yarn能够在每个节点醉倒分配10(40/4)个Map任务或5(40/8)个reduce任务。