这个问题是一个做错误Hadoop中0.20由此将调用context.setStatus()和context.progress()不被报告给底层框架(电话设置不同的柜台不工作要么)。有可用的补丁程序,因此更新到较新版本的Hadoop应该可以解决此问题。
解决方法我收到以下错误:
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('SomeMessage')或者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 progresscontext.setStatus('Progressing:' + count);System.out.println('Optimise Progress:' + context.getStatus());context.progress();count++; }}
映射器的输出显示状态正在更新:
Optimise Progress:Progressing:0Optimise Progress:Progressing:1Optimise Progress:Progressing:2...
但是,在默认时间后,该作业仍被终止。我是否以错误的方式使用上下文?为了成功报告进度,我需要在作业设置中做其他事情吗?