Spark如何处理涉及JDBC数据源的故障场景?

Aet*_*her 5 scala jdbc apache-spark apache-spark-sql

我正在编写一个与 Spark 的 JDBC 数据源实现有相似之处的数据源,我想问一下 Spark 如何处理某些故障场景。据我了解,如果执行程序在运行任务时死亡,Spark 将恢复执行程序并尝试重新运行该任务。然而,这在数据完整性和 Spark 的 JDBC 数据源 API(例如df.write.format("jdbc").option(...).save())?

在的savePartition功能JdbcUtils.scala,我们看到火花调用commit并从数据库中URL生成的Java连接对象的回退功能/由用户提供的凭证(见下文)。但是如果一个 executor 在 commit() 完成之后或在 rollback() 被调用之前就死了,Spark 是否会尝试重新运行任务并再次写入相同的数据分区,实际上是在数据库中创建重复的提交行?如果 executor 在调用 commit() 或 rollback() 的过程中死亡,会发生什么?

try {
    ...
    if (supportsTransactions) {
        conn.commit()
    }
    committed = true
    Iterator.empty
} catch {
    case e: SQLException =>
        ...
        throw e
} finally {
    if (!committed) {
        // The stage must fail.  We got here through an exception path, so
        // let the exception through unless rollback() or close() want to
        // tell the user about another problem.
        if (supportsTransactions) {
          conn.rollback()
        }
        conn.close()
    } else {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 0

由于所描述的原因,我必须引入一些重复数据删除逻辑。您可能最终会犯同样的错误两次(或更多次)。