写入文件时 Databricks 校验和错误

Databricks Checksum error while writing to a file

我是运行 9个节点的工作。

他们都将向文件写入一些信息,执行如下简单的写入操作:

dfLogging.coalesce(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)

但是我收到了这个异常:

py4j.protocol.Py4JJavaError: An error occurred while calling o106.save. : java.util.concurrent.ExecutionException: org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 14.0 failed 1 times, most recent failure: Lost task 1.0 in stage 14.0 (TID 259, localhost, executor driver): org.apache.hadoop.fs.ChecksumException: Checksum error: file:/dbfs/delta/Logging/_delta_log/00000000000000000063.json at 0 exp: 1179219224 got: -1020415797

在我看来,由于并发性,spark 以某种方式失败并生成校验和错误。

是否有任何已知情况可能导致它?

所以有一些事情正在发生,它应该可以解释为什么合并可能不起作用。

  1. coalesce 所做的实际上是合并每个 worker 的分区。例如,如果您有三个工作人员,则可以执行 coalesce(3) 以合并每个工作人员的分区。

  2. 重新分区的作用是将数据洗牌到 increase/decrease 总分区数。在您的情况下,如果您有多个工作人员并且需要单个输出,则必须使用 repartition(1) 因为您希望数据在写出之前位于单个分区上。

为什么合并不起作用? Spark 限制合并期间的洗牌。因此,当您使用 coalesce 时,您无法执行完全洗牌(跨不同的工作人员),而当您使用重新分区时,您可以执行完全洗牌,尽管这是一项昂贵的操作。

下面是可用的代码:

dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)