次のエラーが表示されます。
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
...
ただし、デフォルトの時間が経過しても、ジョブはまだ強制終了されています。コンテキストを間違った方法で使用していますか? 進捗状況を正常に報告するために、ジョブのセットアップで他に行う必要があることはありますか?