由于OutOfMemory和GC开销限制超出错误,我一直有一些失败的工作。为了对抗前者,我尝试在蜂巢脚本的开头设置SET mapred.child.java.opts="-Xmx3G";
**。
基本上,每当我将此选项添加到脚本中时,已安排的MR作业(对于脚本中的第一个查询)都会被杀死'马上。
有关如何纠正此问题的任何想法?是否有任何其他参数需要与最大堆空间一起修补(例如io.sort.mb
)?任何帮助都会最受欢迎。
FWIW,我正在hive-0.7.0
使用hadoop-0.20.2
。我们群集中最大堆大小的默认设置是1200M。
TIA。
** - 尝试了其他一些替代方案(具有滑稽效果但结果没有明显变化):
SET mapred.child.java.opts="-Xmx3G";
SET mapred.child.java.opts="-server -Xmx3072M";
SET mapred.map.child.java.opts ="-server -Xmx3072M";
SET mapred.reduce.child.java.opts ="-server -Xmx3072M";
SET mapred.child.java.opts="-Xmx2G";
更新1:它可能与设置堆大小无关。以任何方式修改mapred.child.java.opts都会导致相同的结果。例如,设置SET mapred.child.java.opts="-XX:+UseConcMarkSweepGC";
具有相同的MR作业被立即杀死的结果。或者甚至在脚本中明确地将其设置为'群集默认值'导致这一点。
更新2:添加了grep
个JobTracker日志here的粘贴框。
答案 0 :(得分:13)
认为这最终会成为一件微不足道的事情,最终会发生这种情况。
如此设置mapred.child.java.opts
:
SET mapred.child.java.opts="-Xmx4G -XX:+UseConcMarkSweepGC";
是不可接受的。但这似乎很顺利:
SET mapred.child.java.opts=-Xmx4G -XX:+UseConcMarkSweepGC;
(减去双引号)
叹息。有更好的调试选项/错误消息本来不错。
答案 1 :(得分:1)
另外两名警卫可以限制任务记忆的使用。两者都是为管理员设计的,以强制执行QoS,因此,如果您不是群集中的某个管理员,则可能无法更改它们。
第一个是ulimit,可以直接在节点OS中设置,也可以通过设置mapred.child.ulimit
。
第二个是一对群集范围的mapred.cluster.max.*.memory.mb
属性,通过将作业设置mapred.job.map.memory.mb
和mapred.job.reduce.memory.mb
与群集范围的限制进行比较来强制执行内存使用。