Я получаю следующую ошибку:
Task attempt_201304161625_0028_m_000000_0 failed to report status for 600 seconds. Killing!
для моих заданий Map. Этот вопрос похож на этот, этот и этот. Однако Я не хочу увеличивать время по умолчанию до того, как hasoop убивает задачу, которая не сообщает о прогрессе, т.е.
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);
}
метод optimizeFurther в классе Optimiser:
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
...
Однако работа по-прежнему убивается после установленного по умолчанию времени. Я использую контекст неправильно? Есть ли что-то еще, что мне нужно сделать в настройке задания, чтобы сообщить о достигнутом прогрессе?