如何在YARN上优雅地停止Spark Streaming应用程序?

时间:2016-04-28 10:08:24

标签: yarn spark-streaming

我正在群集模式下在YARN上运行Spark Streaming应用程序,并且我正在尝试实现正常关闭,以便在应用程序被终止时它将在停止之前完成当前微批处理的执行。

按照一些教程,我已将spark.streaming.stopGracefullyOnShutdown配置为true,我已将以下代码添加到我的应用程序中:

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

然而,当我用

杀死应用程序时

yarn application -kill application_1454432703118_3558

此时执行的微批次未完成。

驱动程序中,我看到第一行打印日志(“正常停止Spark Streaming Application”),但不是最后一行(“Application stopped”)。

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

执行程序日志中,我看到以下错误:

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://sparkDriver@192.168.6.21:49767] has failed, address is now gated for [5000] ms. Reason: [Disassociated]
INFO util.ShutdownHookManager: Shutdown hook called

我认为问题与YARN如何向应用程序发送kill信号有关。关于如何让应用程序优雅停止的任何想法?

2 个答案:

答案 0 :(得分:2)

您应该转到执行程序页面以查看驱动程序的运行位置(在哪个节点上)。 ssh到该节点并执行以下操作:

ps -ef | grep 'app_name'

(将app_name替换为您的classname / appname)。它将列出几个过程。看看这个过程,有些人会是对方的孩子。选择最父进程的id并发送SIGTERM

kill pid

一段时间后,您会看到您的申请已正常终止。

此外,您现在不需要为关闭添加这些挂钩。 使用spark.streaming.stopGracefullyOnShutdown配置来帮助优雅地关闭

答案 1 :(得分:0)

您可以通过在触发自定义条件时调用ssc.stop而不是使用awaitTermination来停止Spark Streaming应用程序。如以下伪代码所示:

ssc.start()
while True:
    time.sleep(10s)
    if some_file_exist:
        ssc.stop(True, True)