gpt4 book ai didi

java - 为什么在 foreachPartition 中建立数据库连接并将其并行化会导致 "ORA-00060: deadlock"?

转载 作者:行者123 更新时间:2023-11-30 08:09:07 24 4
gpt4 key购买 nike

我有一个简单的 Spark 作业,用于将结果映射、计算并将结果写入 Oracle DB。我在将结果写入数据库时​​遇到问题。

按键减少结果后,我调用 foreachPartition 操作来建立连接并将结果写入数据库。如果我将并行度设置为 1,则效果很好。但是当我将 reducer 的并行度更改为 2 或更多时,它只写入部分结果。当我检查日志文件时,我看到此错误:

java.sql.BatchUpdateException: ORA-00060: deadlock detected while waiting for resource

我该如何解决这个问题?

最佳答案

只有当您对同一行进行多次写入时(或者配置不支持您的并发级别,但我发现这对于 2 个并行写入器来说不太可能发生),Oracle 才会陷入死锁。

为了从并行性中获得显着的好处,您需要划分工作,以便两个单独的编写器不会更新相同的行。

这可能意味着需要额外的 Spark 作业,在并行数据库写入之前根据更新影响的行来划分更新。

如果完美地组织写入以避免争用不切实际,您可以增加并行化(并获得更大的粒度),然后重试由于死锁而失败的作业。这是解决真正问题(即争用)的创可贴。如果死锁数量较多,并行化的性能会比串行运行的性能差得多。

关于java - 为什么在 foreachPartition 中建立数据库连接并将其并行化会导致 "ORA-00060: deadlock"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com