我有一个 Spark Standalone(不是 YARN/Mesos)集群和一个正在运行的驱动程序应用程序(在客户端模式下),它与该集群通信以执行其任务。但是,如果我关闭并重新启动 Spark 主服务器和工作程序,驱动程序不会重新连接到主服务器并恢复其工作。
也许我对 Spark Master 和驱动程序之间的关系感到困惑。在这种情况下,Master 是否负责重新连接到驱动程序?如果是这样,Master 是否将其当前状态序列化到磁盘上可以在重启时恢复的某个位置?
我有一个 Spark Standalone(不是 YARN/Mesos)集群和一个正在运行的驱动程序应用程序(在客户端模式下),它与该集群通信以执行其任务。但是,如果我关闭并重新启动 Spark 主服务器和工作程序,驱动程序不会重新连接到主服务器并恢复其工作。
也许我对 Spark Master 和驱动程序之间的关系感到困惑。在这种情况下,Master 是否负责重新连接到驱动程序?如果是这样,Master 是否将其当前状态序列化到磁盘上可以在重启时恢复的某个位置?
在这种情况下,Master 是否负责重新连接到驱动程序?如果是这样,Master 是否将其当前状态序列化到磁盘上可以在重启时恢复的某个位置?
Master 节点和驱动程序之间的关系取决于几个因素。首先,驱动程序是托管您的SparkContext
/StreamingContext
并且负责作业执行的驱动程序。它是创建 DAG 并分别持有DAGScheduler
和TaskScheduler
分配阶段/任务的人。如果您使用 Spark Standalone 并在“客户端模式”下运行作业,主节点可以充当驱动程序的主机。这样,Master 还托管驱动程序进程,如果它死了,驱动程序也会死掉。如果使用“集群模式”,驱动程序驻留在其中一个 Worker 节点上,并经常与 Master 通信以获取当前正在运行的作业的状态,发回有关已完成批次状态的元数据等。
在 Standalone 上运行,如果 Master 死掉并且你重新启动它,Master 不会重新执行之前运行的作业。为了实现这一点,您可以创建并为集群提供一个额外的 Master 节点,并将其设置为 ZooKeeper 可以保持 Masters 状态,并在发生故障时在两者之间进行交换。当您以这种方式设置集群时,Master 知道它之前执行的作业并代表您恢复它们,新的 Master 已带头。
您可以在文档中阅读如何创建备用 Spark Master 节点。