2016-04-28 37 views
7

Sto eseguendo un'applicazione Spark Streaming su YARN in modalità cluster e sto cercando di implementare un arresto regolare in modo che, quando l'applicazione viene uccisa, finisca l'esecuzione del micro batch corrente prima di fermarsi.Come interrompere con garbo un'applicazione Spark Streaming su YARN?

Dopo alcuni tutorial Ho configurato spark.streaming.stopGracefullyOnShutdown a true e ho aggiunto il seguente codice per la mia domanda:

sys.ShutdownHookThread { 
    log.info("Gracefully stopping Spark Streaming Application") 
    ssc.stop(true, true) 
    log.info("Application stopped") 
} 

Tuttavia quando uccido l'applicazione con

yarn application -kill application_1454432703118_3558

micro il batch eseguito in quel momento non è completato.

Nel driver Vedo la prima riga del registro stampata ("Interruzione graduale dell'applicazione Spark Streaming") ma non l'ultima ("Applicazione interrotta").

ERROR yarn.ApplicationMaster: RECEIVED SIGNAL 15: SIGTERM 
INFO streaming.MySparkJob: Gracefully stopping Spark Streaming Application 
INFO scheduler.JobGenerator: Stopping JobGenerator gracefully 
INFO scheduler.JobGenerator: Waiting for all received blocks to be consumed for job generation 
INFO scheduler.JobGenerator: Waited for all received blocks to be consumed for job generation 
INFO streaming.StreamingContext: Invoking stop(stopGracefully=true) from shutdown hook 

Negli esecutori registro vedo il seguente errore:

ERROR executor.CoarseGrainedExecutorBackend: Driver 192.168.6.21:49767 disassociated! Shutting down. 
INFO storage.DiskBlockManager: Shutdown hook called 
WARN remote.ReliableDeliverySupervisor: Association with remote system [akka.tcp://[email protected]:49767] has failed, address is now gated for [5000] ms. Reason: [Disassociated] 
INFO util.ShutdownHookManager: Shutdown hook called 

Credo che il problema è legato al modo in FILATO inviare il segnale kill l'applicazione. Qualche idea su come posso far fermare l'applicazione con garbo?

+0

sei riuscito a risolverlo? –

+0

No, sfortunatamente no. – nicola

risposta

2

si dovrebbe andare alla pagina degli esecutori per vedere dove il driver è in esecuzione (su quale nodo). ssh su quel nodo e fai quanto segue:

ps -ef | grep 'app_name' 

(sostituire nome_app con il nome della classe/nome app). elencherà un paio di processi. Guarda il processo, alcuni saranno figli dell'altro. Scegli l'id del genitore più a processo e inviare un SIGTERM

kill pid 

dopo qualche tempo si vedrà che l'applicazione è terminata con grazia.

Inoltre, non è necessario aggiungere questi hook per lo spegnimento. usa la configurazione spark.streaming.stopGracefullyOnShutdown per facilitare lo spegnimento

+0

Questa sembra l'opzione migliore. Quando si utilizza il checkpoint in Spark Streaming, 'filato applicazione -kill' non uccide il processo di root dell'applicazione, e il checkpoint continuerà anche dopo. –

+0

che uccide l'applicazione immediatamente, provato un paio di volte :( –

+0

@GauravShah, cosa intendi con 'that', comando kill kill o comando linux kill? –