【问题标题】:How to kill a spark application gracefully如何优雅地杀死 Spark 应用程序
【发布时间】:2020-07-28 18:09:36
【问题描述】:

我有一个进程(在 scala 中)在 spark 集群中运行,它处理一些数据、上传结果并更新处理状态。我希望上传和处理状态更新是原子操作,因为状态对于恢复工作和避免双重处理至关重要。每当我们想要更新 jar 时,都需要定期终止正在运行的作业并启动一个新作业。在终止作业时,我想处理原子操作并在上传之前优雅地退出或等待上传和处理状态更新完成。怎样才能达到同样的效果?如果我们使用 yarn API 来终止应用程序,它可能会突然从不一致的状态退出。最好的解决方法是什么?

【问题讨论】:

    标签: scala apache-spark rdd hadoop-yarn livy


    【解决方案1】:

    您可以在 Spark 配置中启用正常关闭

    sparkConf.set(“spark.streaming.stopGracefullyOnShutdown","true") 
    

    当您的作业在 YARN 上运行时,您现在需要向应用程序发送 SIGTERM。这通常通过yarn application -kill <appID> 完成。此命令确实会向您的驱动程序发送一个 SIGTERM,但它也几乎立即 - “yarn.nodemanager.sleep-delay-before-sigkill.ms”(默认 250) - 之后发送一个 SIGKILL。

    因此,您宁愿确保只发送一个 SIGTERM,例如通过调用:

    ps -ef | grep spark | grep <DriverProgramName> | awk '{print $2}' | xargs kill -SIGTERM
    

    此答案基于博客12 为您提供更多详细信息。

    其中一篇文章还描述了如何通过标记文件优雅地关闭您的应用程序。

    【讨论】:

    • 谢谢迈克。上述方法仅限于从运行驱动程序进程的同一台机器上运行它们。但我必须通过 REST API 来完成,因为我的主进程会终止作业或启动新作业,它是服务实例的一部分,并使用 livy/yarn API 来实现上述控制。
    • 后面添加的第二篇文章很有帮助。 This is one more useful blog.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多