我收到以下错误:
Task attempt_201304161625_0028_m_000000_0 failed to report status for 600 seconds. Killing!
我的地图工作。但是, 我不想增加hadoop杀死不报告进度的任务之前的默认时间 ,即
Configuration conf=new Configuration(); long milliSeconds = 1000*60*60; conf.setLong("mapred.task.timeout", milliSeconds);
相反,我想无论是使用定期汇报工作进度context.progress(),context.setStatus("Some Message")或者context.getCounter(SOME_ENUM.PROGRESS).increment(1)或者类似的东西。但是,这仍然导致该作业被杀死。这是我尝试报告进度的代码段。映射器:
context.progress()
context.setStatus("Some Message")
context.getCounter(SOME_ENUM.PROGRESS).increment(1)
protected void map(Key key, Value value, Context context) throws IOException, InterruptedException { //do some things Optimiser optimiser = new Optimiser(); optimiser.optimiseFurther(<some parameters>, context); //more things context.write(newKey, newValue); }
Optimiser类中的optimiseFurther方法:
public void optimiseFurther(<Some parameters>, TaskAttemptContext context) { int count = 0; while(something is true) { //optimise //try to report progress context.setStatus("Progressing:" + count); System.out.println("Optimise Progress:" + context.getStatus()); context.progress(); count++; } }
映射器的输出显示状态正在更新:
Optimise Progress:Progressing:0 Optimise Progress:Progressing:1 Optimise Progress:Progressing:2 ...
但是,在默认时间后,该作业仍被终止。我是否以错误的方式使用上下文?为了成功报告进度,我需要在作业设置中做其他事情吗?
这个问题是一个做错误Hadoop中0.20由此将调用context.setStatus()和context.progress()不被报告给底层框架(电话设置不同的柜台不工作要么)。有可用的补丁程序,因此更新到较新版本的Hadoop应该可以解决此问题。
context.setStatus()