最佳答案
在 Hadoop v1中,我已经分配了每个1GB 大小的7个 mapper 和 reduce 槽,我的 mapper 和 reduce 运行良好。我的机器有8G 内存,8个处理器。 现在使用 YARN,当在同一台机器上运行相同的应用程序时,我得到了容器错误。 默认情况下,我有以下设置:
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
它给了我一个错误:
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 中设置内存限制:
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
但仍然存在错误:
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.
我不明白为什么映射任务需要这么多内存。在我的理解中,1GB 的内存对于我的 map/reduce 任务来说已经足够了。为什么当我将更多的内存分配给容器时,任务会使用更多的内存?是因为每个任务都有更多的分工吗?我觉得更有效的方法是稍微减小容器的大小并创建更多的容器,这样就可以并行运行更多的任务。问题是,我如何确保每个容器不会被分配到超出其处理能力的分割?