"Container is running beyond memory limits":容器超出内存限制运行。

21 浏览
0 Comments

"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任务。为什么当我将更多的内存分配给容器时,任务的使用更多呢?是因为每个任务获得了更多的拆分吗?我感觉减小容器的大小并创建更多的容器更有效,这样可以并行运行更多的任务。问题是如何确保每个容器不会分配超过其处理能力的拆分?

admin 更改状态以发布 2023年5月23日
0
0 Comments

在Yarn层级上会对虚拟内存和物理内存的使用比例进行检查。问题不仅在于虚拟内存没有足够的物理内存。还在于给定物理内存的情况下虚拟内存使用量超出了预期。

:这在Centos/RHEL 6上发生是因为它过分地分配了虚拟内存。

可通过以下方式解决:

  1. yarn.nodemanager.vmem-check-enabled设置为false来禁用虚拟内存使用检查;

  2. 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
  

0
0 Comments

您还应该适当配置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的上限

总之:

  1. 在YARN中,您应使用mapreduce配置,而不是mapred配置。 编辑:由于您编辑了问题,此注释现已不适用。
  2. 您配置的实际上是您想请求多少,而不是最大可分配多少。
  3. 使用上面列出的java.opts设置配置最大限制。

最后,您可能希望查看这个其他SO问题,该问题描述了类似的问题(以及解决方案)。

0