如何保证驱动重启后DAG不重新计算?

How to ensure that DAG is not recomputed after the driver is restarted?

如何确保 spark 的整个 DAG 高度可用,即在驱动程序重新启动时不从头开始重新计算(yarn 集群模式下的默认 HA)。

目前,我使用 spark 来编排多个较小的作业,即

这是针对多个 table 执行的。 现在,当驱动程序重新启动时,即在处理第二个 table 时,第一个被重新处理 - 尽管它已经成功存储。

我认为检查点的默认机制(原始输入值)没有意义。 这里有什么好的解决方案? 是否可以检查(小)配置信息并仅重新处理尚未计算的内容?

when the driver is restarted (default HA in yarn cluster mode).

当 Spark 应用程序的驱动程序消失时,您的 Spark 应用程序将消失,所有缓存的数据集也将消失。这是默认设置。

您必须使用某种缓存解决方案,例如 https://www.alluxio.org/ or https://ignite.apache.org/。两者都与 Spark 一起工作,并且都声称提供的功能比 Spark 应用程序寿命更长。

曾经有人使用 Spark Job Server 在 Spark 应用程序之间共享数据(类似于重启 Spark 驱动程序)。

TL;DR Spark 不是任务编排工具。虽然它有内置的调度器和一些内置的容错机制,但它适用于细粒度的任务管理,例如服务器编排(嘿,我们可以在每台机器上调用 pipe 来执行 bash脚本,对)。

如果您想要粒度恢复,请选择对给定进程有意义的最小计算单元(根据描述,读取、散列、写入看起来是个不错的选择),将其设为应用程序并使用外部编排来提交作业。

您可以通过检查是否存在预期输出并在这种情况下跳过部分工作来构建穷人的替代方案,但实际上不存在 - 我们有各种经过实战测试的工具,它们可以做得比这更好。

作为旁注,Spark 不为驱动程序提供 HA,仅提供自动重启的监督。独立作业(读取 -> 转换 -> 写入)也创建独立的 DAG - 没有全局 DAG,应用程序的适当检查点需要其状态的完整快照(就像旧的 BLCR)。