apache-spark - 如何保证驱动重启后DAG不被重新计算?

标签 apache-spark hadoop-yarn high-availability

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

目前,我使用 Spark 来协调多个较小的作业,即

  • 阅读表1
  • 对一些列进行哈希处理
  • 写入 HDFS

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

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

最佳答案

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

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

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

顺便说一句,Spark 不为驱动程序提供 HA,仅提供自动重启的监督。此外,独立作业(读取 -> 转换 -> 写入)创建独立的 DAG - 没有全局 DAG,并且应用程序的正确检查点需要其状态的完整快照(如旧的 BLCR )。

关于apache-spark - 如何保证驱动重启后DAG不被重新计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775468/

相关文章:

java - Hadoop的默认分组比较器?

hadoop - 无法查看作业历史记录(http ://localhost:19888) page in web browser in Hadoop

postgresql - 同一数据库上的两个主实例

scala - Spark- 写入 128 MB 大小的 Parquet 文件

hadoop - 如何在 Tez 上为 Pig 设置队列名称?

scala - Spark中如何将字符串转换为日期格式

linux - 如何在 AWS ec 虚拟机上使用 hadoop 1.0 配置高可用性

mysql - 如何在故障转移期间延迟 ActiveRecord MySQL 重新连接

scala - ClassNotFoundException Spark-提交 scala

hadoop - Spark Worker和Executors核心