为什么 SparkContext 随机关闭,如何从 Zeppelin 重新启动它?

Why does SparkContext randomly close, and how do you restart it from Zeppelin?

我正在使用 Zeppelin 编写 spark-sql 查询,有时我突然开始收到此错误(在未更改代码之后):

Cannot call methods on a stopped SparkContext.

然后输出进一步说:

The currently active SparkContext was created at:

(No active SparkContext.)

这显然没有意义。这是齐柏林飞艇的错误吗?还是我做错了什么?如何重新启动 SparkContext?

谢谢

这个问题我遇到过几次。

如果您将 master 设置为 yarn-client,可能是由于 Resource Manager 停止/重启,解释器进程可能仍然 运行 但 Spark Context(这是一个 Yarn 应用程序) ) 不再存在。

您可以通过查看您的资源管理器 Web 界面检查 Spark 上下文是否仍然 运行,并检查是否有名为 Zeppelin 的应用程序 运行。

有时从 Zeppelin 中重新启动解释器进程(解释器选项卡 --> spark --> 重启)将解决问题。

其他时候您需要:

  • 从命令行终止 Spark 解释器进程
  • 删除 Spark 解释器 PID 文件
  • 下次您开始一个段落时,它将启动新的 spark 上下文

我在 PySpark 中面临同样的问题 运行 多个作业。似乎在 Spark 2.0.0 中,使用 SparkSession,当我调用 spark.stop() 时,SparkSession 调用以下跟踪:

# SparkSession 
self._sc.stop()
# SparkContext.stop()
self._jsc = None

然后,当我尝试使用新的 SparkContext 创建新作业时,SparkSession return 与之前 self.jsc = None 相同的 SparkContext。

我在 spark.stop() 之后解决了设置 SparkSession._instantiatedContext = None 强制 SparkSession 在我下次需要时创建 new SparkContext。

这不是最好的选择,但同时它解决了我的问题。

请问您的驱动内存是否足够?我通过

解决了这个问题
  1. 加大驱动内存
  2. 调整 GC:

    --conf spark.cleaner.periodicGC.interval=60 
    --conf spark.cleaner.referenceTracking.blocking=false
    

当 运行 pyspark 命令时,我注意到这个问题更多,即使使用单元格执行挂起在 运行 状态的微不足道的变量声明。 正如 user1314742 上面提到的,只需杀死相关的 PID 就可以为我解决这个问题。

例如:

ps -ef | grep zeppelin

这是重启Spark解释器和重启zeppelin notebook都不能解决问题的地方。我猜是因为它无法控制挂起的 PID 本身。