容器的运行超出了较大文件的物理内存



我有一个小型 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 问题/答案包含有关影响映射器计数的更多详细信息。设置地图任务数和减少任务数

相关内容

  • 没有找到相关文章

最新更新