ricevo il seguente errore:Impossibile riportare lo stato per 600 secondi. Uccidere! Stato del procedimento di Hadoop
Task attempt_201304161625_0028_m_000000_0 failed to report status for 600 seconds. Killing!
per i miei lavori mappa. Questa domanda è simile a this, this e this. Tuttavia, non voglio aumentare il tempo predefinito prima Hadoop uccide un compito che non segnala il progresso, vale a dire,
Configuration conf=new Configuration();
long milliSeconds = 1000*60*60;
conf.setLong("mapred.task.timeout", milliSeconds);
Invece, voglio riferire periodicamente i progressi utilizzando context.progress()
, context.setStatus("Some Message")
o context.getCounter(SOME_ENUM.PROGRESS).increment(1)
o qualcosa di simile. Tuttavia, questo causa comunque la morte del lavoro. Ecco i frammenti di codice in cui sto tentando di segnalare i progressi. Il mappatore:
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);
}
metodo optimiseFurther all'interno della classe per ottimizzare:
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++;
}
}
l'uscita da un mappatore mostra lo stato viene aggiornato:
Optimise Progress:Progressing:0
Optimise Progress:Progressing:1
Optimise Progress:Progressing:2
...
Tuttavia, il lavoro è ancora essere ucciso dopo il periodo di tempo predefinito. Sto usando il contesto nel modo sbagliato? C'è qualcos'altro che devo fare nella configurazione del lavoro per riportare i progressi con successo?
Grazie per il vostro aiuto! L'ho già letto da Cloudera. Comunque, sto usando la nuova API che usa un oggetto 'Context' invece del vecchio oggetto' Reporter'. – Sam