一尘不染

无法报告状态600秒钟。杀人!报告Hadoop的进度

java

我收到以下错误:

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
...

但是,在默认时间后,该作业仍被终止。我是否以错误的方式使用上下文?为了成功报告进度,我需要在作业设置中做其他事情吗?


阅读 199

收藏
2020-12-03

共1个答案

一尘不染

这个问题是一个做错误Hadoop中0.20由此将调用context.setStatus()context.progress()不被报告给底层框架(电话设置不同的柜台不工作要么)。有可用的补丁程序,因此更新到较新版本的Hadoop应该可以解决此问题。

2020-12-03