我有一个小型 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>
纱线站点.xml:
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>13312</value>
</property>
还有一个使用 python 的映射流任务(没有化简器),我只是从文件中读取行并选择要打印的特定字段(我保留其中一个字段作为键,其余一个大字符串)。
每一行都包含相当大的数组,因此默认的Hadoop配置被更改为上面的配置(只是为了确保每条记录都适合映射器,这样我就可以测试我的代码而不必担心内存)。虽然每行/记录都小于块大小(我保留了默认值)。
我的问题是,当我在原始文件的 7gb 样本上测试我的代码时,一切都运行良好,但是当我在原始文件 (~100GB) 上尝试它时,大约 50% 的映射阶段,我收到错误"容器正在运行超出较大文件的物理内存",它报告它已超过 3GB 限制。
为什么映射器需要更多内存来处理较大的文件?计算不是应该逐个记录吗?如果块大小小于(很多)可用内存,映射器最终如何使用超过 3GB?
我觉得这个问题有点令人困惑。
如果我正确地解释了你的场景,并不是单个映射器破坏了你的记忆,有可能有更多的映射器被并行生成,因为有更多的输入块 - 这就是Hadoop的大部分并行性的来源。 内存错误可能是由于尝试每个节点同时运行的映射器过多。 如果集群较小,则可能需要将映射器/节点比率保持在较低的输入集。
此 SO 问题/答案包含有关影响映射器计数的更多详细信息。设置地图任务数和减少任务数