我收到以下错误:
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)
或类似的东西定期报告进度。但是,这仍然会导致作业被终止。这是我试图报告进度的代码片段。映射器:
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
...
但是,在默认时间后,该作业仍会被终止。我是否以错误的方式使用上下文?为了成功报告进度,我还需要在工作设置中做些什么吗?