I pojawia się następujący błąd:Nie udało się zgłosić stanu przez 600 sekund. Zabicie! Raportowanie postępu w Hadoop
Task attempt_201304161625_0028_m_000000_0 failed to report status for 600 seconds. Killing!
na mojej mapie miejsc pracy. To pytanie jest podobne do this, this i this. Jednak Nie chcę, aby zwiększyć domyślny czas przed Hadoop zabija zadania, które nie raportuje postępy, tj
Configuration conf=new Configuration();
long milliSeconds = 1000*60*60;
conf.setLong("mapred.task.timeout", milliSeconds);
Zamiast tego chcę okresowo zgłaszać postępy stosując albo context.progress()
, context.setStatus("Some Message")
lub context.getCounter(SOME_ENUM.PROGRESS).increment(1)
lub coś podobnego. Jednak nadal powoduje to zabicie zadania. Oto fragmenty kodu, w których próbuję zgłosić postęp. Element odwzorowujący:
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);
}
optimiseFurther metoda w klasie Optymalizator:
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++;
}
}
Wyjście z odwzorowującym pokazuje stan jest aktualizowany:
Optimise Progress:Progressing:0
Optimise Progress:Progressing:1
Optimise Progress:Progressing:2
...
Jednak praca jest nadal bycie zabitym po domyślnym czasie. Czy używam kontekstu w niewłaściwy sposób? Czy jest coś jeszcze, co muszę zrobić w ustawieniach zadania, aby pomyślnie złożyć raport z postępów?
Dzięki za pomoc! Przeczytałem to już od Cloudera. Jednak używam nowego interfejsu API, który używa obiektu 'Context' zamiast starego obiektu' Reporter'. – Sam