如果节点/分区发生故障,Spark如何确保数据一致性?

问题描述

我们有一个在spark上运行的ETL作业,该作业从sql Server读取数据。然后,通过应用mappartition对数据框执行一些转换,并创建具有不同架构的新数据框。完成一些进一步的转换,最后将结果数据帧写回到sql Server。

我的问题是假设在将sql Server中的数据插入8个分区中时,其中一个spark节点出现故障,spark如何确保数据完整性?其他分区将在数据库中插入数据,并且在发生故障时,数据库中的数据不一致。

spark只会通过应用所有转换来重新创建失败的分区吗?

万一再次失败,数据库中其他分区的数据将处于什么状态?

解决方法

简短回答。

  • 如果您还没有检查站,

    • 然后,因为您不是从源中读取可以跟踪最初使用的文件的信息-如果从源中重新计算-例如蜂巢表
      • 将进行重新计算,并且对于后续的节点故障恢复,结果可能会有所不同-除非该源是静态的。
  • 具有仍可以在其他位置读取的.cache和/或检查点,

    • 我的理解是,您将获得相同的结果。

很难测试恕我直言。

加分

应用所有转换后的缓存不是标准的事情 去做。它是昂贵的。而且,由于内存问题甚至 存储问题,Spark可以逐出分区并返回源代码,因此 数据可能不同于先前的处理调用。而如果 如果您坚持不懈,并且节点在写入之前已关闭,则您丢失了 缓存。情况相同。