【问题标题】:How Spark ensures data consistency if a node/partition fails?如果节点/分区发生故障,Spark 如何确保数据一致性?
【发布时间】:2020-12-02 22:34:36
【问题描述】:

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

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

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

如果再次失败,数据库中其他分区的数据会是什么状态?

【问题讨论】:

  • 我相信 Spark 不符合 ACID 标准,除非您在 Azure 中使用 Delta Lake,因此它无法确保设计的一致性。这是留给开发人员处理的事情。
  • 那么,你能接受这个答案吗?

标签: sql sql-server apache-spark


【解决方案1】:

简短回答。

  • 如果你还没有检查点,

    • 那么由于您没有从可以跟踪最初使用的文件的源中读取 - 如果从源重新计算 - 例如蜂巢表,
      • 会发生重新计算,并且后续节点故障恢复的结果可能会有所不同 - 除非该源是静态的。
  • 使用 .cache 和/或仍然可以在其他地方读取的检查点,

    • 我的理解是你会得到相同的结果。

恕我直言,很难测试。

加分

应用所有转换后的缓存不是标准的东西 去做。它是昂贵的。此外,由于内存问题,甚至 存储问题,Spark 可以驱逐一个分区并返回源,所以 数据可能与之前的处理调用不同。而如果 如果您坚持并且节点在写入之前关闭,您已经丢失了 缓存。同样的情况。

【讨论】:

  • 是的,我正在应用所有转换后缓存数据。另外,请回答这个问题,如果说我正在将数据帧写入 8 个分区的 sql server 并且 1 个分区失败而其他分区成功,数据将如何保持数据库的一致性?
  • 添加了一些方面。需要看大局。
猜你喜欢
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多