"Container is running beyond memory limits":容器超出内存限制运行。
"Container is running beyond memory limits":容器超出内存限制运行。
在Hadoop v1中,我将每个mapper和reducer槽分配了7个大小为1GB的空间,我的mappers和reducers运行良好。我的机器内存为8G,有8个处理器。现在在YARN上,在同一台机器上运行相同的应用程序时,我收到了容器错误。默认情况下,我有这些设置:
yarn.scheduler.minimum-allocation-mb 1024 yarn.scheduler.maximum-allocation-mb 8192 yarn.nodemanager.resource.memory-mb 8192
它给了我一个错误:
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中设置内存限制:
mapreduce.map.memory.mb 4096 mapreduce.reduce.memory.mb 4096
但仍然出现错误:
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任务。为什么当我将更多的内存分配给容器时,任务的使用更多呢?是因为每个任务获得了更多的拆分吗?我感觉减小容器的大小并创建更多的容器更有效,这样可以并行运行更多的任务。问题是如何确保每个容器不会分配超过其处理能力的拆分?
在Yarn层级上会对虚拟内存和物理内存的使用比例进行检查。问题不仅在于虚拟内存没有足够的物理内存。还在于给定物理内存的情况下虚拟内存使用量超出了预期。
注:这在Centos/RHEL 6上发生是因为它过分地分配了虚拟内存。
可通过以下方式解决:
-
将yarn.nodemanager.vmem-check-enabled设置为false来禁用虚拟内存使用检查;
-
将yarn.nodemanager.vmem-pmem-ratio设置为较高的值来提高虚拟内存与物理内存的比例。
参考资料:
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中添加以下属性
yarn.nodemanager.vmem-check-enabled false Whether virtual memory limits will be enforced for containers yarn.nodemanager.vmem-pmem-ratio 4 Ratio between virtual memory to physical memory when setting memory limits for containers
您还应该适当配置MapReduce的最大内存分配。从这篇HortonWorks教程中:
[...]
我们集群中的每台机器都有48GB的RAM,其中一些RAM应该保留给操作系统使用。在每个节点上,我们将分配40GB的RAM供YARN使用,另外8GB留给操作系统。
对于我们的示例集群,一个Container的最小RAM(yarn.scheduler.minimum-allocation-mb)为2GB。因此,我们将为Map任务容器分配4GB,Reduce任务容器分配8GB。
在mapred-site.xml中:
mapreduce.map.memory.mb
:4096
mapreduce.reduce.memory.mb
:8192每个容器将运行用于Map和Reduce任务的JVM。JVM堆大小应设置为低于上面定义的Map和Reduce内存,以便它们在YARN分配的容器内存范围内。
在mapred-site.xml中:
mapreduce.map.java.opts
:-Xmx3072m
mapreduce.reduce.java.opts
:-Xmx6144m
上述设置配置Map和Reduce任务将使用的物理RAM的上限。
总之:
- 在YARN中,您应使用
mapreduce
配置,而不是mapred
配置。 编辑:由于您编辑了问题,此注释现已不适用。 - 您配置的实际上是您想请求多少,而不是最大可分配多少。
- 使用上面列出的
java.opts
设置配置最大限制。
最后,您可能希望查看这个其他SO问题,该问题描述了类似的问题(以及解决方案)。