hadoop容器没有分配足够的空间

e5nqia27  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(350)

我正在运行一个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无法在Map程序运行之前计算出它需要为容器分配多少内存,所以我应该如何在容器需要额外内存的情况下为它分配更多内存呢?

mwkjh3gx

mwkjh3gx1#

您还应该为mapreduce正确配置内存分配。从本hortonworks教程:
[...]
对于我们的示例集群,我们有一个容器的最小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运行jvm并减少任务。jvm堆大小应该设置为低于上面定义的map和reduce内存,以便它们在yarn分配的容器内存的范围内。
在mapred-site.xml中: mapreduce.map.java.opts :
-Xmx3072m mapreduce.reduce.java.opts : -Xmx6144m 以上设置配置Map和减少任务将使用的物理ram的上限。
最后,hadoop邮件列表中的这个线程中有人也有同样的问题,在他们的情况下,结果他们的代码中出现了内存泄漏。

pxyaymoc

pxyaymoc2#

如果以上任何配置都没有帮助。如果这个问题与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)对应用程序进行探查,然后查看内存的使用位置。这可以给你很好的见解。

相关问题