在映射减少作业中,出现错误“java.lang.OutOfMemoryError:Java堆空间”。由于我在mapper函数中遇到此错误;我以为,当我降低映射器的输入大小时,我不会再有错误了,所以我将mapred.max.split.size更改为一个更低的值。
然后,我再次开始工作,发现“要执行的映射器任务数量”增加了,因此我认为降低mapred.max.split.size是一个好主意:更多的映射器具有较低的内存需求。
但是,我一次又一次收到“java.lang.OutOfMemoryError:Java堆空间”错误。
看来,我不了解hadoop的工作原理。
有什么建议么?
最佳答案
您可以使用以下命令修改子堆大小:mapred.child.java.opts=-Xmx3000m
(在较新的API中,您可以使用mapreduce.map.java.opts
来更具体)。您还可以通过选择可以并行运行多少个map和reduce任务来调整节点。这可以由 map 的数量控制,并减少Tasktracker中可用的插槽,例如:mapred.tasktracker.map.tasks.maximum=7
mapred.tasktracker.reduce.tasks.maximum=3
还有个选项:mapred.cluster.map.memory.mb=300
和mapred.job.map.memory.mb=600
,但我认为您暂时不需要它们。
关于hadoop - 如何在hadoop中更改映射器的内存要求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18737615/