【发布时间】:2015-01-26 01:58:17
【问题描述】:
我有一个小型 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(没有reducer)的地图流任务,我只是从文件中读取行并选择要打印的特定字段(我将其中一个字段作为键,其余的作为一个大字符串)。
每一行都包含一个相当大的数组,因此默认的 hadoop 配置更改为上面的配置(只是为了确保每条记录都适合映射器,这样我就可以测试我的代码而不必担心内存)。虽然每行/记录都小于块大小(我保留了默认值)。
我的问题是,当我在原始文件的 7gb 样本上测试我的代码时,一切都运行得很好,但是当我在原始文件 (~100GB) 上尝试它时,大约 50% 的映射阶段我得到错误“容器在物理内存之外运行更大的文件”,它报告它已经超过了 3GB 的限制。
为什么映射器需要更多内存来存储更大的文件? 计算不应该逐条记录吗? 如果块大小小于(很多)可用内存,映射器如何最终使用超过 3GB?
我觉得这个问题有点令人困惑。
【问题讨论】:
标签: python hadoop memory-management mapreduce hadoop-streaming