Spark JDBC 写入 Teradata:由于死锁错误导致 Stage 失败,多个 Spark 任务因事务 ABORTed 而失败

问题描述

我正在使用 spark JDBC write 将数据从 hive 加载到 teradata 视图。我使用了 200 个 vcore 并将数据划分为 10000 个分区。

Spark 任务因以下错误而失败,导致阶段失败。有时应用程序成功完成但有一些重复的记录

由:java.sql.sqlException: [teradata Database] [teraJDBC 16.20.00.10] [Error 2631] [sqlState 40001] 事务因死锁而中止。

以下是我使用的代码

val df = spark.sql("select * from hive table").distinct.repartition(10000).write.mode(overwrite) .option("truncate",Truncate).j​​dbc(url,dbTable,dproperties)

teradata 视图是使用“AS LOCKING ROW FOR ACCESS”创建的。该表还有一个唯一的 PI。

我无法弄清楚为什么某些 spark 任务会因死锁错误而失败,是否有办法阻止我的整个 spark 应用程序因任务失败而失败。

解决方法

尝试插入同一个表的数十个会话可能会导致死锁。即使视图定义了访问锁,也必须获得写锁才能将行插入到后备表中。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...