如何优雅地提前结束 Spark 应用程序?

B. *_*ith 4 scala apache-spark

如果我有一个空的 RDD,我希望我的 Spark 应用程序能够优雅地结束。在 Scala 中执行此操作的最佳方法是什么?

当我刚使用时:

if (myRDD.isEmpty) { sparkSession.stop() }

Spark 应用程序尝试继续并抛出一个IllegalStageException.

我需要System.exit(0)事后吗?我应该在return后面加一个吗?

Dog*_*027 5

sparkSession.stop()只会使 Spark 会话无效,但不会停止作业。这就是为什么您会收到IllegalStageException, 因为作业(仍在运行!)尝试访问已经无效的会话。

我建议使用return或抛出异常来提前结束工作,这比System.exit(0)

  • 这不是一个愚蠢的问题,答案实际上与 Scala 无关。抛出异常或使用 `return` 将控制权传递给调用者,而 `System.exit()` 会终止应用程序。如果你确定你是独立运行的,那么使用 `System.exit()` 就可以了,尽管它不受欢迎;然而,尽管 Spark 应用程序看起来像独立的应用程序,但实际上是作为集群上 Spark 运行时的一部分运行的,您可能会比预期终止的次数更多。例如,查看 https://issues.apache.org/jira/browse/SPARK-1446。 (6认同)