Hadoop:运行 超出了虚拟内存限制,显示出巨大的数字

Hadoop: Running beyond virtual memory limits, showing huge numbers

我是运行一个MapReduce Pipes程序,我设置的内存限制如下:

纱线-site.xml:

<property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>3072</value>
</property>
<property>
            <name>yarn.scheduler.minimum-allocation-mb</name>
            <value>256</value>
</property>

在 mapred-site.xml:

<property>
            <name>mapreduce.map.memory.mb</name>
            <value>512</value>
</property>
<property>
            <name>mapreduce.reduce.memory.mb</name>
            <value>512</value>
</property>
<property>
            <name>mapreduce.map.java.opts</name>
            <value>-Xmx384m</value>
</property>
<property>
            <name>mapreduce.reduce.java.opts</name>
            <value>-Xmx384m</value>
</property>

我运行目前在伪分布式模式下的单个节点上。在容器被杀死之前我收到以下错误:

2015-04-11 12:47:49,594 INFO [AsyncDispatcher event handler] org.apache.hadoop.mapreduce.v2.app.job.impl.TaskAttemptImpl: Diagnostics report from attempt_1428741438743_0001_m_000000_0: Container [pid=8140,containerID=container_1428741438743_0001_01_000002] is running beyond virtual memory limits. Current usage: 304.1 MB of 1 GB physical memory used; 1.0 TB of 2.1 GB virtual memory used. Killing container.

我主要担心的是使用了 1.0 TB 的虚拟内存,我 运行 的应用程序远未消耗这么多内存,甚至远未消耗 1 GB 内存.

这是否意味着我的代码中存在内存泄漏,或者我的内存配置有误?

谢谢。

此致,

我发现了问题所在:在我的部分代码中,每个映射器都必须访问本地 lmdb 数据库。当 lmdb 数据库启动时,它会保留 1 TB 的虚拟内存,这导致 Hadoop 认为我使用了这么多内存,但实际上我没有。

我通过将 yarn.nodemanager.vmem-check-enabled 设置为 [=14= 解决了这个问题]false in yarn-site.xml,这会阻止 Hadoop 检查虚拟内存限制。请注意,除非您确定它,否则您不应该使用它,因为 Hadoop 试图通过此检查来保护您免受内存泄漏和类似问题的影响。我只是因为确定它不是内存泄漏才使用它