我有一个小的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以上?
我发现这个问题有点令人困惑。
答案 0 :(得分:0)
如果我正确地解释您的场景,那么单个映射器不会破坏您的内存,可能会有更多的映射器并行生成,因为还有更多的映射器输入块 - 这是Hadoop的大部分并行性来自于此。内存错误可能来自于太多的映射器试图在每个节点同时运行。如果您有一个小型集群,则可能需要将较大的输入集保持较低的映射器/节点比率。
这个SO问题/答案有更多关于影响映射器计数的细节。 Setting the number of map tasks and reduce tasks