【问题标题】:how to change mapper memory requirement in hadoop?如何更改hadoop中的映射器内存要求?
【发布时间】:2013-09-11 09:36:21
【问题描述】:

在 map-reduce 作业中,我收到错误“java.lang.OutOfMemoryError: Java heap space”。由于我在映射器函数中收到此错误;我认为当我降低映射器的输入大小时,我不会再有错误,所以我将 mapred.max.split.size 更改为更低的值。

然后,我再次开始工作,我看到“要执行的映射器任务的数量”增加了,所以我认为降低 mapred.max.split.size 是个好主意:更多的映射器具有更低的内存需求。

但是,我一次又一次地收到“java.lang.OutOfMemoryError: Java heap space”错误。

看来,我不明白 hadoop 是如何工作的。

有什么建议吗?

【问题讨论】:

  • 你能分享你的映射器代码吗?
  • 我正在使用 mahout,seq2sparse 函数。

标签: hadoop mapreduce


【解决方案1】:

您可以修改 子堆大小mapred.child.java.opts=-Xmx3000m,(在较新的 API 中,您可以更具体地使用 mapreduce.map.java.opts)。您还可以通过选择可以并行运行多少个 map 和 reduce 任务来调整您的节点。这可以通过 ma​​p 的数量 来控制,并减少 Tasktracker 中可用的 slots,例如:

mapred.tasktracker.map.tasks.maximum=7
mapred.tasktracker.reduce.tasks.maximum=3

还有更多选项mapred.cluster.map.memory.mb=300mapred.job.map.memory.mb=600,但我认为您现在不需要它们。

【讨论】:

  • 我已经修改了mapred.child.java.opts和mapred.tasktracker.*.tasks.maximum,但是没有解决办法。我认为,真正的原因是;我仍然不明白 hadoop 是如何工作的。例如;插槽和任务之间的关系是什么?例如; “一个作业可以为单个地图任务请求多个槽”是什么意思?
  • 一个 tasktracker 正在运行 map 并减少任务。映射任务是在单个输入拆分上调用的映射函数。 tasktracker 在从属实例上运行(与 jobtracker = master 相反)。 tasktracker可以创建多个jvm来处理任务,受slots参数的限制。我认为您必须向我们提供有关您的地图功能的额外信息,以便我们了解内存不足的原因
猜你喜欢
  • 1970-01-01
  • 2013-02-27
  • 2014-06-09
  • 2011-04-12
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多