如何使 Spark 驱动程序对 Master 重启有弹性?

Posted

技术标签:

【中文标题】如何使 Spark 驱动程序对 Master 重启有弹性?【英文标题】:How to make Spark driver resilient to Master restarts? 【发布时间】:2016-10-13 15:38:27 【问题描述】:

我有一个 Spark Standalone(不是 YARN/Mesos)集群和一个正在运行的驱动程序应用程序(在客户端模式下),它与该集群通信以执行其任务。但是,如果我关闭并重新启动 Spark 主服务器和工作程序,驱动程序不会重新连接到主服务器并恢复其工作。

也许我对 Spark Master 和驱动程序之间的关系感到困惑。在这种情况下,Master 是否负责重新连接到驱动程序?如果是这样,Master 是否会将其当前状态序列化到磁盘某个它可以在重启时恢复的位置?

【问题讨论】:

您是在客户端模式还是集群模式下运行作业?另外,您正在运行哪个集群管理器? 我在这里问过类似的问题***.com/q/35815386/6022341 @YuvalItzchakov 我正在客户端模式下运行驱动程序。 @YuvalItzchakov 正如我在问题中提到的,它是一个独立集群。 【参考方案1】:

在这种情况下,是否是 Master 负责重新连接 还给司机?如果是,Master 是否序列化其当前状态 到可以在重启时恢复的磁盘?

主节点和驱动程序之间的关系取决于几个因素。首先,驱动程序是托管您的SparkContext/StreamingContext 并负责作业执行的驱动程序。它是创建 DAG 的那个,并持有分别分配阶段/任务的 DAGSchedulerTaskScheduler。如果您使用 Spark Standalone 并在“客户端模式”下运行作业,主节点可以充当驱动程序的主机。这样,Master 还托管驱动程序进程,如果它死了,驱动程序也会死掉。如果使用“集群模式”,驱动程序驻留在其中一个 Worker 节点上,并经常与 Master 通信以获取当前正在运行的作业的状态,发回有关已完成批次状态的元数据等。

在独立运行时,如果 Master 死了并且您重新启动它,则 Master 不会重新执行之前运行的作业。为了实现这一点,您可以创建并为集群提供一个额外的 Master 节点,并将其设置为 ZooKeeper 可以保持 Masters 状态,并在发生故障时在两者之间进行交换。当您以这种方式设置集群时,Master 知道它先前执行的作业并代表您恢复它们,新的 Master 已带头。

您可以阅读如何创建备用 Spark Master 节点in the documentation。

【讨论】:

@dOxxx 欢迎!希望它有所帮助。

以上是关于如何使 Spark 驱动程序对 Master 重启有弹性?的主要内容,如果未能解决你的问题,请参考以下文章

spark 双master 一直处于standby的异常情况

大数据:Spark Standalone 集群调度多Master节点的可用性

[转] - Spark排错与优化

大数据:Spark Standalone 集群调度多Master节点的可用性

如何在 Spark Streaming 中自动重启故障节点?

大数据:Spark Standalone 集群调度如何创建分配Executors的资源