对于较大的文件,容器运行超出物理内存

时间:2014-11-27 12:49:00

标签: python hadoop memory-management mapreduce hadoop-streaming

我有一个小的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>

纱-site.xml中:

      <property>
            <name>yarn.nodemanager.resource.memory-mb</name>
            <value>13312</value>
    </property>

使用python(没有reducer)的地图流任务,我只是从文件中读取行并选择要打印的特定字段(我将其中一个字段保留为键,其余字段保留一个大字符串)。

每一行都包含相当大的数组,因此默认的hadoop配置更改为上面的一个(只是为了确保每个记录都适合映射器,因此我可以测试我的代码而不用担心内存)。每行/记录虽小于块大小(我保留了默认值)。

我的问题是,当我在原始文件的7gb样本上测试我的代码时,一切都运行完美,但是当我在原始文件(~100GB)上尝试大约50%的映射阶段时,我得到的错误是& #34;容器在物理内存之外运行以获取更大的文件&#34;据报道,它超过了3GB的限制。

为什么映射器需要更多内存来存放更大的文件? 是不是应该按记录记录的计算? 如果块大小(大量)比可用内存小,那么映射器最终如何使用3GB以上?

我发现这个问题有点令人困惑。

1 个答案:

答案 0 :(得分:0)

如果我正确地解释您的场景,那么单个映射器不会破坏您的内存,可能会有更多的映射器并行生成,因为还有更多的映射器输入块 - 这是Hadoop的大部分并行性来自于此。内存错误可能来自于太多的映射器试图在每个节点同时运行。如果您有一个小型集群,则可能需要将较大的输入集保持较低的映射器/节点比率。

这个SO问题/答案有更多关于影响映射器计数的细节。 Setting the number of map tasks and reduce tasks