为什么在foreachPartition中建立数据库连接并将其并行化导致“ORA-00060:死锁”?

时间:2015-06-05 15:08:54

标签: java apache-spark spark-streaming

我有一个简单的Spark作业,可以将结果映射,计算和写入Oracle DB。将结果写入DB时遇到问题。

按键减少结果后,我调用foreachPartition动作建立连接并将结果写入DB。如果我将并行化设置为1,它可以正常工作。但是当我将减速器的并行化更改为2或更多时,它只会写出部分结果。当我检查日志文件时,我看到了这个错误:

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

这可能意味着额外的Spark Job可以在并行化DB写入之前根据它们影响的行来划分更新。

如果完美地组织您的写入以避免争用是不切实际的,您可以添加增加的并行化(并获得更多粒度),然后重试由于死锁而失败的作业。这是争夺真正问题的创可贴。如果你有很多死锁,那么并行化的性能会比连续运行时差得多。