Zeppelin:如何在 zeppelin 中重新启动 sparkContext

Posted

技术标签:

【中文标题】Zeppelin:如何在 zeppelin 中重新启动 sparkContext【英文标题】:Zeppelin: How to restart sparkContext in zeppelin 【发布时间】:2017-03-25 19:17:44 【问题描述】:

我正在使用 zeppelins spark 解释器的隔离模式,在这种模式下,它将为 spark 集群中的每个笔记本启动一个新工作。笔记本执行完成后,我想通过 zeppelin 终止工作。为此,我做了sc.stop 这停止了 sparkContext 并且作业也从 spark 集群停止。但是下次当我尝试运行笔记本时,它不会再次启动sparkContext。那么该怎么做呢?

【问题讨论】:

【参考方案1】:

这有点反直觉,但您需要访问解释器菜单选项卡而不是直接停止 SparkContext

转到解释器列表。

找到Spark解释器,点击右上角的restart

【讨论】:

除了手动重启解释器就没有别的办法了吗? 当在EMR 上使用ZeppelinSpark 并从S3 加载外部fat-jar 时,我发现重新启动解释器一次是不够的。假设我从S3 加载了 fat-jar,它已经升级了。为了确保在interpreter 中加载new jar,我这样做:(1)​​编辑解释器dependencies 并删除现有的jar,保存更改(2)重新启动解释器(3)再次编辑 interpreter dependencies 并添加新的 jar(它可能具有与以前相同的路径) (4) 再次重新启动解释器【参考方案2】:

您可以通过单击相关解释器左侧的重新启动图标(在本例中为 spark 解释器),在解释器绑定(右上角的齿轮)中重新启动笔记本的解释器。

【讨论】:

【参考方案3】:

在使用 Zeppelin 和 Spark 时,我也偶然发现了同样的问题并进行了一些调查。一段时间后,我的第一个结论是:

停止 SparkContext 可以通过在段落中使用 sc.stop() 来完成 重启 SparkContext 只能使用 UI(菜单 -> 解释器 -> Spark 解释器 -> 点击restart 按钮)

但是,既然 UI 允许通过按下按钮重新启动 Spark 解释器,为什么不直接对 restart 按钮的 API 调用进行逆向工程!结果是,restarting Spark 解释器发送了以下 HTTP 请求:

PUT http://localhost:8080/api/interpreter/setting/restart/spark

幸运的是,Zeppelin 能够与多个口译员一起工作,其中一位也是shell 口译员。因此,我创建了两个段落:

第一段用于在需要时停止 SparkContext:

%spark
// stop SparkContext
sc.stop()

第二段是用于以编程方式重新启动 SparkContext:

%sh
# restart SparkContext
curl -X PUT http://localhost:8080/api/interpreter/setting/restart/spark

在使用这两个段落停止并重新启动 SparkContext 之后,我运行另一个段落来检查重新启动是否有效......并且它有效!因此,虽然这不是官方解决方案,更多的是一种解决方法,但它仍然是合法的,因为我们除了在段落中“按下”restart 按钮之外什么都不做!

Zeppelin 版本:0.8.1

【讨论】:

这对我在 EMR 上不起作用。通过 shell 解释器运行 curl 命令时,出现以下错误:curl: (7) Failed to connect to localhost port 8080: Connection refused【参考方案4】:

我正在调查为什么 sc 在 yarn-client 中停止 spark 的问题。我发现这是火花本身的问题(火花版本> = 1.6)。在spark客户端模式下,AM通过RPC连接到Driver,有两个连接。它设置 NettyRpcEndPointRef 连接到服务器 'SparkDriver' 的驱动程序服务 'YarnSchedulerBackEnd',另一个连接是 EndPoint 'YarnAM'。

在 AM 和 Driver 之间的这些 RPC 连接中,没有心跳。因此,AM 知道驱动程序是否连接的唯一方法是 EndPoint 'YarnAM' 中的 OnDisconnected 方法。通过 NettyRpcEndPointRef 的驱动程序和 AM 连接的断开消息将通过 RPCHandler 将“postToAll”发送到端点“YarnAM”。当它们之间的 TCP 连接断开,或者 keep alive 消息发现 tcp 不活动时(在 Linux 系统中可能需要 2 小时),它会标记应用程序成功。

所以当Driver Monitor Process发现yarn应用状态变为SUCCESS时,就会停止sc。

所以根本原因是,在Spark客户端中,没有重试连接到驱动程序来检查驱动程序是否处于活动状态,而是尽快标记yarn应用程序。也许Spark可以修改这个问题。

【讨论】:

以上是关于Zeppelin:如何在 zeppelin 中重新启动 sparkContext的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SparkContext 会随机关闭,如何从 Zeppelin 重新启动?

Apache Zeppelin - 如何在 Apache Zeppelin 中使用 Helium 框架

使用 Apache Zeppelin 重新运行带有 -deprecation 的 Scala 代码

在 Zeppelin 中如何使用 Hive

如何在 Zeppelin 中的 Python Pyspark 中打印粗体 - 以及在 Zeppelin 中使用 python-print-function 的其他格式

如何在 Zeppelin 中使用 Plotly