Hadoop on Mac with IntelliJ IDEA - 7 解决failed to report status for 600 seconds. Killing!问题

时间:2021-01-02 07:53:38

本文讲述作业在Hadoop 1.2.1完成map后ruduce阶段遇到failed to report status for 600 seconds. Killing!问题的解决过程。

环境:Mac OS X 10.9.5, IntelliJ IDEA 13.1.4, Hadoop 1.2.1

Hadoop放在虚拟机中,宿主机通过SSH连接,IDE和数据文件在宿主机。IDEA自身运行于JDK 1.8,IDEA工程及Hadoop使用JDK 1.6。

提交作业到hadoop后,作业执行时间过长,输出如下

Hadoop on Mac with IntelliJ IDEA - 7 解决failed to report status for 600 seconds. Killing!问题

reduce阶段进行到66%后重新开始,接着输出报告10分钟内汇报状态失败,进程被终止提示。然后,reduce继续。

造成超时的原因可能是reducer执行耗时计算却没向Hadoop框架汇报任务进展。还可能是,程序耗尽所有java堆空间或垃圾回收器频繁启动,导致reducer无法及时向job tracker发送状态因而被终止。或者是,其中一个reducer接收到太多错误的数据,它们使程序失去响应。对此,主要有两种解决方式。

方式一,在mapred-site.xml中增大超时值

<property>
<name>mapred.task.timeout</name>
<value>1200000</value>
</property>

默认超时值为600000毫秒,即10分钟。若不想修改全局配置,只需修改任务的configuration,为单个任务作特殊处理。

方式二,每隔n行记录汇报一次,如Reducer文档示例所示

public void reduce(K key, Iterator<V> values,
OutputCollector<K, V> output,
Reporter reporter) throws IOException {
// report progress
if ((noValues%10) == 0) {
reporter.progress();
}
// ...
}

另外,还可以在上述示例中添加一个自定义计数器,如reporter.incrCounter(NUM_RECORDS, 1);当以上方式无效时,可考虑方式三。

如果是Hadoop 1.x以上版本,则reporter过时,用org.apache.hadoop.mapreduce.TaskAttemptContext.progress()来向jobtracker发送心跳包。

方式三,尝试加大JVM堆大小,在mapred-site.xml设置

<property>
<name>mapred.child.java.opts</name>
<value>-Xmx2048m</value>
</property>

如何确定堆大小,可参考Hadoop on Mac with IntelliJ IDEA - 5 解决java heap space问题引用资料:JVM调优总结 -Xms -Xmx -Xmn -Xss。同时,尝试减少并行reducer数量。

<property>
<name>mapred.tasktracker.reduce.tasks.maximum</name>
<value>1</value>
</property>

默认值为2,新设置数值应该小于当前值。

参考

[1]http://*.com/questions/15281307/the-reduce-fails-due-to-task-attempt-failed-to-report-status-for-600-seconds-ki