我有一个小的hadoop(2.5.1)集群,其中有以下配置
(关于内存限制)mapred-site.xml:
<property>
<name>mapreduce.map.memory.mb</name>
<value>3072</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx2450m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx1630m</value>
</property>
yarn-site.xml:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>13312</value>
</property>
还有一个使用python的map streaming任务(没有reducer),我只是从文件中读取行,然后选择要打印的特定字段(我将其中一个字段作为键,其余的作为一个大字符串)。
每一行包含相当大的数组,因此默认的hadoop配置被更改为上面的配置(只是为了确保每个记录都适合Map器,这样我就可以测试代码而不必担心内存问题)。但是每一行/记录都小于blocksize(我用默认值保留了这个值)。
我的问题是,当我在原始文件的7gb样本上测试代码时,一切都运行得很好,但当我在原始文件(~100gb)上尝试时,大约有50%的Map阶段我得到了一个错误,即“容器运行超出了较大文件的物理内存”,它报告它已经超过了3gb的限制。
为什么Map器需要更多的内存来存储更大的文件?计算不应该一个记录下来吗?如果块大小比可用内存小(很多),Map器如何使用超过3gb的内存?
我觉得这个问题有点令人困惑。
1条答案
按热度按时间mqkwyuun1#
如果我正确地解释了您的场景,并不是因为一个Map程序正在破坏您的内存,而是因为有太多的输入块,所以有可能并行生成更多的Map程序—这就是hadoop的大部分并行性的来源。内存错误可能是由于太多Map程序试图在每个节点上同时运行。如果您有一个小的集群,可能需要为较大的输入集保持较低的Map器/节点比率。
因此,这个问题/答案有更多关于影响Map器计数的细节。设置Map任务数并减少任务