2014-01-08 140 views
53

在Hadoop v1中,我已经分配了每个大小为1GB的映射器和减速器插槽,我的映射器&减速器运行良好。我的机器有8G内存,8个处理器。 现在用YARN,当在同一台机器上运行相同的应用程序时,我得到了容器错误。 默认情况下,我有这样的设置:容器运行超出内存限制

<property> 
    <name>yarn.scheduler.minimum-allocation-mb</name> 
    <value>1024</value> 
    </property> 
    <property> 
    <name>yarn.scheduler.maximum-allocation-mb</name> 
    <value>8192</value> 
    </property> 
    <property> 
    <name>yarn.nodemanager.resource.memory-mb</name> 
    <value>8192</value> 
    </property> 

它给了我错误:

Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container. 

我又试图在mapred-site.xml中的内存限制:

<property> 
    <name>mapreduce.map.memory.mb</name> 
    <value>4096</value> 
    </property> 
    <property> 
    <name>mapreduce.reduce.memory.mb</name> 
    <value>4096</value> 
    </property> 

但仍然出现错误:

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container. 

我很困惑为什么地图任务需要这么多的内存。根据我的理解,1GB的内存足够用于我的地图/缩小任务。为什么当我给容器分配更多内存时,这个任务使用更多?是因为每个任务都会分裂吗?我觉得稍微减小容器的大小并创建更多容器会更有效,因此可以同时运行更多的任务。问题是我怎样才能确保每个容器不会被分配更多的分裂比它可以处理?

+0

的[Hadoop的纱线容器没有分配足够的空间]可能重复(http://stackoverflow.com/questions/20803577/hadoop -yarn-container-does-not-allocate-enough-space) – Sheena

+0

嗨!你的配置'yarn.nodemanager.vmem-pmem-ratio = 2'? – sprite

回答

68

您还应该正确配置MapReduce的最大内存分配。从this HortonWorks tutorial

[...]

Each machine in our cluster has 48 GB of RAM. Some of this RAM should be >reserved for Operating System usage. On each node, we’ll assign 40 GB RAM for >YARN to use and keep 8 GB for the Operating System

For our example cluster, we have the minimum RAM for a Container (yarn.scheduler.minimum-allocation-mb) = 2 GB. We’ll thus assign 4 GB for Map task Containers, and 8 GB for Reduce tasks Containers.

In mapred-site.xml:

mapreduce.map.memory.mb : 4096

mapreduce.reduce.memory.mb : 8192

Each Container will run JVMs for the Map and Reduce tasks. The JVM heap size should be set to lower than the Map and Reduce memory defined above, so that they are within the bounds of the Container memory allocated by YARN.

In mapred-site.xml:

mapreduce.map.java.opts : -Xmx3072m

mapreduce.reduce.java.opts : -Xmx6144m

The above settings configure the upper limit of the physical RAM that Map and Reduce tasks will use.

概括起来:

  1. 纱,你应该使用mapreduce CONFIGS,而不是mapred的。 编辑:现在您已编辑您的问题,此评论不再适用。
  2. 你正在配置的实际上是你要多少请求,而不是分配的最大值是多少。
  3. 最大限制使用上面列出的java.opts设置进行配置。

最后,你可能要检查它描述了类似的问题(和解决方案)这等SO question

+0

是的。通过设置'mapreduce.map.java.opts'和'mapreduce.reduce.java.opts'解决了我的问题。你知道分配给任务的实际内存是否只由'mapreduce.map/reduce.memory.mb'定义? 'yarn.scheduler.minimum-allocation-mb'如何影响实际内存分配? – Lishu

+0

@lishu,如果有帮助,请接受答案。关于最后一个问题,纱线设置适用于集群中的任何集装箱分配;这包括地图和减少任务,但也包括来自其他类型应用程序的其他任务。 mapreduce设置仅适用于mapreduce作业。 – cabad

+0

@cabad,我开发了一个Lishu正在使用的库。我在想,如果知道MR任务正在产生一个实际上分配大部分内存的流程(hadoop streaming),你是否会改变答案中的任何内容。当然,Xmx设置不会影响外部进程,因为它不是一个Java程序。谢谢你的帮助。 – piccolbo

7

由于名誉低,我无法对接受的答案发表评论。不过,我想补充一点,这是行为设计​​。 NodeManager正在查杀你的容器。这听起来像你正在尝试使用hadoop streaming,它正在作为map-reduce任务的子进程运行。 NodeManager监视任务的整个进程树,如果它分别占用比mapreduce.map.memory.mb或mapreduce.reduce.memory.mb中设置的最大内存大的内存,我们会期望Nodemanager终止该任务,否则你的任务是窃取属于其他容器的内存,这是你不想要的。

32

在纱线级别检查垂直和物理内存使用率。 问题不仅在于虚拟机没有足够的物理内存。但是这是因为对于给定的物理内存,虚拟内存使用量超过预期。

注意:由于其主动分配虚拟内存,CentOS/RHEL 6上发生这种情况。

它可以通过解析为:

  1. 禁用虚拟内存的使用情况检查通过设置 yarn.nodemanager.vmem启用入住;

  2. 通过将yarn.nodemanager.vmem-pmem-ratio设置为较高的值来增加VM:PM比率。

参考

https://issues.apache.org/jira/browse/HADOOP-11364

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/

添加以下的纱site.xml的财产

<property> 
    <name>yarn.nodemanager.vmem-check-enabled</name> 
    <value>false</value> 
    <description>Whether virtual memory limits will be enforced for containers</description> 
    </property> 
<property> 
    <name>yarn.nodemanager.vmem-pmem-ratio</name> 
    <value>4</value> 
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description> 
    </property> 
5

我在EMR中使用HIVE的问题非常类似。没有现存的解决方案为我工作 - 即没有mapreduce配置为我工作;也没有将yarn.nodemanager.vmem-check-enabled设置为false。

然而,什么结束了工作被设置tez.am.resource.memory.mb,例如:

hive -hiveconf tez.am.resource.memory.mb=4096 

另一个设置要考虑的调整是yarn.app.mapreduce.am.resource.mb

+0

庵@hiroprotagonist,你知道,如果“调整”的纱线参数具有纱线开始之前发生,或者如果它在应用时只使用(并可以从一个工作改为下一个)? –

+1

我已经能够设置在应用程序的时间。特别是在蜂巢交互式控制台中。 – hiroprotagonist

+0

谢谢你,它像一个魅力 – sathiyarajan

1

尽管火花在EMR工作我有同样的问题,设置maximizeResourceAllocation=true诀窍;希望它能帮助别人。您必须在创建群集时对其进行设置。从EMR docs:

aws emr create-cluster --release-label emr-5.4.0 --applications Name=Spark \ 
--instance-type m3.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json 

凡myConfig.json应该说:

[ 
    { 
    "Classification": "spark", 
    "Properties": { 
     "maximizeResourceAllocation": "true" 
    } 
    } 
]