2013-04-17 8 views
12

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?

Odpowiedz

7

Ten problem jest zrobić z bug in Hadoop 0.20 której domaga się context.setStatus() i context.progress() nie są zgłaszane do podstawowej ramy (nazywa się ustawione różne liczniki też nie działają). Dostępna jest łatka, więc uaktualnienie do nowszej wersji Hadoop powinno to naprawić.

6

To, co może się zdarzyć, polega na tym, że należy wywoływać te metody postępu w samym Reporterze, które znajdują się w kontekście i nie można ich wywoływać w samym kontekście.

Od Cloudera

Zgłoś postęp

Jeśli raporty zadaniowe żadnego postępu w ciągu 10 minut (patrz właściwość mapred.task.timeout), a następnie zostanie on zabity przez Hadoop. Większość zadań nie napotyka tej sytuacji, ponieważ raportują postępy w sposób niejawny, odczytując dane wejściowe i wyjściowe. Jednak niektóre prace, które nie przetwarzają zapisów w ten sposób, mogą zostać odrzucone przez to zachowanie i spowodować zabicie ich zadań. Symulacje są dobrym przykładem, ponieważ wykonują wiele intensywnych procesorów na każdej mapie i zazwyczaj zapisują wynik tylko na końcu obliczeń. Powinny być napisane w taki sposób, aby regularnie raportować postępy (częściej niż co 10 minut). Można to osiągnąć na wiele sposobów:

Call setStatus() on Reporter to set a human-readable description of 
the task’s progress 
Call incrCounter() on Reporter to increment a user counter 
Call progress() on Reporter to tell Hadoop that your task is 
still there (and making progress) 

Cloudera Tips

public Context(Configuration conf, TaskAttemptID taskid, 
       RecordReader<KEYIN,VALUEIN> reader, 
       RecordWriter<KEYOUT,VALUEOUT> writer, 
       OutputCommitter committer, 
       StatusReporter reporter, 
       InputSplit split) 
+0

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

Powiązane problemy