写入 Synapse DWH 池时出现 Spark 错误

Spark errors when writing to Synapse DWH pool

我正在尝试使用 ("com.databricks.spark.sqldw") 连接器将 append/overwrite 模式下的数据帧写入 Synapse table 中。官方文档没有过多提及 ACID此写操作的属性。我的问题是,如果写操作中途失败,是否会回滚之前执行的操作?

文档确实提到的一件事是,在此操作期间可能会抛出两个 类 异常:SqlDWConnectorException 和 SqlDWSideException。我的逻辑是,如果写操作符合 ACID,那么我们不做任何事情,但如果不做,那么我们计划将此操作封装在一个 try-catch 块中,并寻找其他选项(可能是重试,或超时)。

它保证了 ACID 事务行为。

参考:What is Delta Lake,其中指出:

Azure Synapse Analytics is compatible with Linux Foundation Delta Lake. Delta Lake is an open-source storage layer that brings ACID (atomicity, consistency, isolation, and durability) transactions to Apache Spark and big data workloads. This is fully managed using Apache Spark APIs available in Azure Synapse.

作为一种好的做法,您应该编写可重新运行的代码,例如删除可能重复的记录。想象一下,您正在为失败的一天重新运行 一个文件,或者有人想要重新处理某个时期。但是 SQL 池确实通过事务隔离级别实现了 ACID:

Use transactions in a SQL pool in Azure Synapse

SQL pool implements ACID transactions. The isolation level of the transactional support is default to READ UNCOMMITTED. You can change it to READ COMMITTED SNAPSHOT ISOLATION by turning ON the READ_COMMITTED_SNAPSHOT database option for a user SQL pool when connected to the master database.

您应该记住,专用 SQL 池的默认事务隔离级别是 READ UNCOMMITTED,它允许脏读。所以我的想法是,ACID(原子的、一致的、隔离的、持久的)是一个标准,每个供应商都通过事务隔离级别在不同程度上实施该标准。每个 事务隔离级别 可以是强满足 ACID 或弱满足 ACID。这是我对 READ UNCOMMITTED 的总结:

  • A - 你应该合理地期望你的事务是原子的,但你应该(恕我直言)编写你的代码以重新运行
  • C - 你应该合理地期望你的交易是一致的,但请记住专用的 SQL 池不支持外键并且 NOT ENFORCED 关键字适用于创建时的唯一索引。
  • I - READ UNCOMMITED 满足 'I' 隔离的 ACID 标准,允许脏读(未提交数据),但收益是并发性。您可以如上所述将默认值更改为 READ COMMITTED SNAPSHOT ISOLATION,但您需要有充分的理由这样做并在您的应用程序上进行广泛的测试,以了解对行为、性能、并发性等的影响
  • D - 你应该合理地期望你的交易是持久的

所以你的问题的答案是,根据你的事务隔离级别(记住默认是 READ UNCOMMITTED 在专用 SQL 池中),每个事务在一定程度上满足 ACID,最值得注意的是隔离 (I) 未完全满足。您有机会通过更改默认交易来更改此设置 以减少并发性和现在强制性的回归测试为代价。我认为您对 Atomicity 最感兴趣,我的建议就在那里,确保您的代码无论如何都可以重新运行。

您倾向于在更多 OLTP 系统中看到 'higher' 事务隔离级别 (READ SERIALIZABLE),而不是像 Synapse 这样的 MPP 系统,代价是并发性。您希望您的银行提款工作正常吗?