在hadoopv1中,我已经分配了每个7个大小为1gb的mapper和reducer插槽,我的mapper和reducer运行良好。我的机器有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.
我不明白为什么Map任务需要这么多内存。据我所知,1gb的内存足够我完成map/reduce任务。为什么当我给容器分配更多的内存时,任务会使用更多的内存?是不是因为每个任务都有更多的拆分?我觉得减少一点容器的大小并创建更多的容器更有效,这样更多的任务可以并行运行。问题是如何确保每个容器分配的拆分不会超出其处理能力?
8条答案
按热度按时间cetgtptt1#
在emr中使用spark时,我遇到了相同的问题和设置
maximizeResourceAllocation=true
成功了;希望它能帮助别人。创建集群时必须设置它。电子病历文件:其中myconfig.json应该说:
xoshrz7s2#
我们最近也面临这个问题。如果这个问题与mapper内存有关,我想建议您检查以下几项。
检查合路器是否启用?如果是,则意味着reduce逻辑必须在所有记录(mapper的输出)上运行。这发生在记忆中。根据您的应用程序,您需要检查启用组合器是否有帮助。在网络传输字节和所用时间/memory/cpu之间进行权衡,以减少“x”记录数上的逻辑。
如果你觉得组合器没有多大价值,就禁用它。
如果您需要combiner,并且“x”是一个巨大的数字(比如数百万条记录),那么考虑更改分割逻辑(对于默认输入格式,使用较少的块大小,通常1块大小=1个分割)以将较少的记录Map到单个Map器。
在单个Map器中处理的记录数。请记住,所有这些记录都需要在内存中排序(Map器的输出被排序)。如果需要,请考虑将mapreduce.task.io.sort.mb(默认值为200mb)设置为更高的值。mapred-configs.xml文件
如果上面的任何一个都没有帮助,请尝试将Map器逻辑作为独立应用程序运行,并使用探查器(如jprofiler)对应用程序进行探查,然后查看内存的使用位置。这可以给你很好的见解。
dvtswwa33#
您还应该正确配置mapreduce的最大内存分配。从本hortonworks教程:
[...]
我们集群中的每台机器都有48 gb的ram。这个ram中的一些应该>保留给操作系统使用。在每个节点上,我们将为>yarn分配40gbram以供使用,并为操作系统保留8gb
对于我们的示例集群,我们有一个容器的最小ram(yarn.scheduler.minimum allocation mb)=2GB。因此,我们将为map任务容器分配4GB,为reduce任务容器分配8GB。
在mapred-site.xml中:
mapreduce.map.memory.mb
: 4096mapreduce.reduce.memory.mb
: 8192每个容器将为map运行jvm并减少任务。jvm堆大小应该设置为低于上面定义的map和reduce内存,以便它们在yarn分配的容器内存的范围内。
在mapred-site.xml中:
mapreduce.map.java.opts
:-Xmx3072m
mapreduce.reduce.java.opts
:-Xmx6144m
以上设置配置Map和减少任务将使用的物理ram的上限。总而言之:
在Yarn中,你应该使用
mapreduce
配置,而不是mapred
一个。编辑:这个评论已经不适用了,现在你已经编辑了你的问题。您所配置的实际上是您要请求的数量,而不是要分配的最大数量。
最大限制配置为
java.opts
上面列出的设置。最后,您可能需要检查描述类似问题(和解决方案)的其他so问题。
flvtvl504#
在带有ubunto操作系统的windows-linux子系统上运行yarn时,出现错误“超出虚拟内存限制,杀死容器”,我通过禁用文件中的虚拟内存检查来解决此问题 yarn-site.xml文件
j5fpnvbx5#
对虚拟和物理内存使用率进行了检查。问题不仅在于虚拟机没有足够的物理内存。但这是因为虚拟内存的使用超过了给定物理内存的预期。
注意:由于centos/RHEL6对虚拟内存的积极分配,这种情况在centos/RHEL6上发生。
可通过以下方式解决:
通过将yarn.nodemanager.vmem-check-enabled设置为false来禁用虚拟内存使用检查;
通过将warn.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/
在yarn-site.xml中添加以下属性
f1tvaqid6#
我还没有亲自检查,但hadoopYarn容器虚拟内存的理解和解决容器运行超出虚拟内存限制的错误听起来非常合理
我通过改变来解决这个问题
yarn.nodemanager.vmem-pmem-ratio
我同意:另一个不太推荐的解决方案是通过将yarn.nodemanager.vmem-check-enabled设置为false来禁用虚拟内存检查。
yi0zb3m47#
我在emr中使用hive时遇到了一个非常类似的问题。现有的解决方案都不适合我——也就是说,mapreduce配置都不适合我;布景也没有
yarn.nodemanager.vmem-check-enabled
错误的。然而,最终奏效的是
tez.am.resource.memory.mb
,例如:另一个需要考虑调整的设置是
yarn.app.mapreduce.am.resource.mb
8ehkhllq8#
我不能对公认的答案发表评论,因为名声不好。不过,我想补充一点,这种行为是有设计的。节点管理器正在杀死你的容器。听起来像是在尝试使用hadoop流,它是作为map reduce任务的子进程运行的。nodemanager监视任务的整个进程树,如果它占用的内存超过mapreduce.map.memory.mb或mapreduce.reduce.memory.mb中分别设置的最大内存,我们会期望nodemanager终止该任务,否则您的任务将窃取属于其他容器的内存,这是您不希望的。