如何优雅地终止 Spark 应用程序

Say*_*osh 2 scala hadoop-yarn apache-spark rdd livy

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

mik*_*ike 5

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

\n
sparkConf.set(\xe2\x80\x9cspark.streaming.stopGracefullyOnShutdown","true") \n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
sparkConf.set(\xe2\x80\x9cspark.streaming.stopGracefullyOnShutdown","true") \n
Run Code Online (Sandbox Code Playgroud)\n

这个答案基于博客12,它们为您提供了更多详细信息。

\n

在其中一篇文章中,还描述了如何通过标记文件正常关闭应用程序。

\n