Hadoop纱线容器不会分配足够的空间

时间:2013-12-27 15:51:36

标签: hadoop

我正在运行Hadoop作业,在我的yarn-site.xml文件中,我有以下配置:

    <property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>2048</value>
    </property>
    <property>
            <name>yarn.scheduler.maximum-allocation-mb</name>
            <value>4096</value>
    </property>

但是,我偶尔会遇到以下错误:

Container [pid=63375,containerID=container_1388158490598_0001_01_000003] is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 2.8 GB of 4.2 GB virtual memory used. Killing container.

我发现通过增加yarn.scheduler.minimum-allocation-mb,为容器分配的物理内存会增加。但是,我并不总是希望为我的容器分配4GB,并且认为通过明确指定最大大小,我能够解决这个问题。我意识到Hadoop无法弄清楚在映射器运行之前需要为容器分配多少内存,那么只有在需要额外内存时,我应该如何为容器分配更多内存?

2 个答案:

答案 0 :(得分:9)

您还应该正确配置MapReduce的内存分配。来自this HortonWorks tutorial

  

[...]

     

对于我们的示例群集,我们拥有Container的最小RAM   (yarn.scheduler.minimum-allocation-mb)= 2 GB。因此我们将分配4 GB   对于Map任务容器,以及8 GB用于Reduce任务容器。

     

在mapred-site.xml中:

     

mapreduce.map.memory.mb:4096

     

mapreduce.reduce.memory.mb:8192

     

每个Container都将为Map和Reduce任务运行JVM。 JVM   堆大小应设置为低于Map和Reduce内存   在上面定义,以便它们在Container的范围内   由YARN分配的内存。

     

在mapred-site.xml中:

     

mapreduce.map.java.opts-Xmx3072m

     

mapreduce.reduce.java.opts-Xmx6144m

     

以上设置配置物理RAM的上限   Map和Reduce任务将使用

最后,this thread in the Hadoop mailing list中的某个人遇到了同样的问题,在他们的案例中,结果发现他们的代码中存在内存泄漏。

答案 1 :(得分:0)

如果上述任何配置都没有帮助。如果问题与映射器内存有关,我想建议需要检查的几件事情是。

  • 检查合并器是否已启用?如果是,那么这意味着必须在所有记录(mapper的输出)上运行reduce逻辑。 这种情况发生在内存中。根据您的应用程序,您需要检查启用组合器是否有帮助。权衡取决于网络传输字节和时间/存储器/ CPU之间的减少逻辑“X&#39;记录数量。
    • 如果你认为合成器价值不大,那就禁用它。
    • 如果你需要合并器和&#39; X&#39;是一个庞大的数字(比如数百万条记录),然后考虑改变你的分割逻辑(对于默认输入格式使用较少的块大小,通常1块大小= 1分割)将较少数量的记录映射到单个映射器。
  • 在单个映射器中处理的记录数。请记住,所有这些记录都需要在内存中排序 (映射器的输出已排序)。如果需要,请考虑将 mapreduce.task.io.sort.mb (默认值为200MB)设置为更高的值。 mapred-configs.xml
  • 如果上述任何一项都没有帮助,请尝试将映射器逻辑作为独立应用程序运行,并使用Profiler(如JProfiler)对应用程序进行概要分析,并查看内存的使用位置。这可以为您提供非常好的见解。