写入 Synapse DWH 池时出现 Spark 错误

Posted

技术标签:

【中文标题】写入 Synapse DWH 池时出现 Spark 错误【英文标题】:Spark errors when writing to Synapse DWH pool 【发布时间】:2021-11-19 18:54:06 【问题描述】:

我正在尝试使用 ("com.databricks.spark.sqldw") 连接器以附加/覆盖模式将数据帧写入 Synapse 表。官方文档没有太多关于此写入操作的 ACID 属性的提及。我的问题是,如果在写入过程中写入操作失败,之前执行的操作会被回滚吗?

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

【问题讨论】:

您使用的是 Synapse 笔记本吗?如果是这样,为什么不使用here 中描述的内置连接器以及我的更多注释here。 @wBob 很糟糕,我没有提到笔记本。那么它的 Azure Databricks。再说一遍,那个连接器能保证 ACID 吗? 你能分享你看到的确切错误吗? @KarthikBhyresh-MTI 到目前为止还没有出现任何错误,我们正在研究的是->一旦代码从 DEV 移动到意外抛出错误,我们如何处理这种情况产品。我们正在考虑实现一个 try-catch 机制。 【参考方案1】:

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

Use transactions in a SQL pool in Azure Synapse

SQL 池实现 ACID 事务。隔离级别 事务支持默认为 READ UNCOMMITTED。你可以改变 通过打开它来读取提交的快照隔离 用户 SQL 池的 READ_COMMITTED_SNAPSHOT 数据库选项 连接到主数据库。

您应该记住,专用 SQL 池的默认事务隔离级别是 READ UNCOMMITTED,它允许脏读。所以我的想法是,ACID(Atomic、Consistent、Isolated、Durable)是一个标准,每个提供者通过事务隔离级别不同程度地实现该标准。每个事务隔离级别可以是强满足 ACID 或弱满足 ACID。这是我对READ UNCOMMITTED的总结:

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

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

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

【讨论】:

【参考方案2】:

它保证了 ACID 事务的行为。

参考:What is Delta Lake,其中声明:

Azure Synapse Analytics 与 Linux Foundation Delta 兼容 湖。 Delta Lake 是一个开源存储层,它带来了 ACID (原子性、一致性、隔离性和持久性)事务 Apache Spark 和大数据工作负载。这是完全管理使用 Azure Synapse 中可用的 Apache Spark API。

【讨论】:

这真的回答了这个问题吗?它似乎特定于 Delta Lake,OP 的帖子中没有提到。

以上是关于写入 Synapse DWH 池时出现 Spark 错误的主要内容,如果未能解决你的问题,请参考以下文章

由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题

如何写入 Synapse 专用 sql 池

Spark SQL 传递变量 - Synapse(Spark 池)

将数据写入 Hive Spark SQL 时出现 ArrayIndexOutOfBoundsException 异常

在 Spark 2.0 中从 AVRO 写入镶木地板时出现 NullPointerException

从 Azure Synapse 中的 Apache Spark 将数据写入 SQL DW