在map-reduce作业中,我收到错误"java.lang.OutOfMemoryError: Java heap space"。因为我在映射器函数中收到此错误;我认为当我降低映射器的输入大小时,我不会再有错误,所以我将 mapred.max.split.size 更改为更低的值。
然后,我再次开始工作,我看到"要执行的映射器任务数量"增加了,所以我认为降低mapred.max.split.size是个好主意:更多的映射器具有更低的内存要求。
但是,我一次又一次地收到"java.lang.OutOfMemoryError: Java heap space"错误。
看来,我不明白哈多普是如何工作的。
有什么建议吗?
以下命令修改子堆大小:mapred.child.java.opts=-Xmx3000m
,(在较新的 API 中,您可以使用 mapreduce.map.java.opts
更具体地修改子堆大小)。您还可以通过选择可以并行运行的映射和归约任务数量来调整节点。这可以通过地图数量来控制,并减少任务跟踪器中可用的插槽,例如:
mapred.tasktracker.map.tasks.maximum=7
mapred.tasktracker.reduce.tasks.maximum=3
还有更多选择:mapred.cluster.map.memory.mb=300
和mapred.job.map.memory.mb=600
但我认为您现在不需要它们。