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

How to make Spark driver resilient to Master restarts?

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

可能是我对Spark Master和driver的关系搞不清楚了。在这种情况下,Master 是否负责重新连接回驱动程序?如果是这样,Master 是否将其当前状态序列化到磁盘上可以在重启时恢复的某个位置?

In a situation like this, is the Master responsible for reconnecting back to the driver? If so, does the Master serialize its current state to disk somewhere that it can restore on restart?

主节点和驱动程序之间的关系取决于几个因素。首先,驱动程序是托管您的 SparkContext/StreamingContext 并且负责作业执行的人。它是创建 DAG 的那个,并持有分别分配 stages/tasks 的 DAGSchedulerTaskScheduler。如果您使用 Spark Standalone 并且 运行 您在 "Client Mode" 中的工作,则主节点可以充当驱动程序的主机。这样,Master 还托管驱动程序进程,如果它死了,驱动程序也会随之死去。在使用 "Cluster mode" 的情况下,驱动驻留在其中一个 Worker 节点上,并经常与 Master 通信以获取当前 运行ning 作业的状态,发回有关已完成状态的元数据批次等

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

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