写入文件时 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 以某种方式失败并生成校验和错误。
是否有任何已知情况可能导致它?
所以有一些事情正在发生,它应该可以解释为什么合并可能不起作用。
coalesce 所做的实际上是合并每个 worker 的分区。例如,如果您有三个工作人员,则可以执行 coalesce(3) 以合并每个工作人员的分区。
重新分区的作用是将数据洗牌到 increase/decrease 总分区数。在您的情况下,如果您有多个工作人员并且需要单个输出,则必须使用 repartition(1) 因为您希望数据在写出之前位于单个分区上。
为什么合并不起作用?
Spark 限制合并期间的洗牌。因此,当您使用 coalesce 时,您无法执行完全洗牌(跨不同的工作人员),而当您使用重新分区时,您可以执行完全洗牌,尽管这是一项昂贵的操作。
下面是可用的代码:
dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)
我是运行 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 以某种方式失败并生成校验和错误。
是否有任何已知情况可能导致它?
所以有一些事情正在发生,它应该可以解释为什么合并可能不起作用。
coalesce 所做的实际上是合并每个 worker 的分区。例如,如果您有三个工作人员,则可以执行 coalesce(3) 以合并每个工作人员的分区。
重新分区的作用是将数据洗牌到 increase/decrease 总分区数。在您的情况下,如果您有多个工作人员并且需要单个输出,则必须使用 repartition(1) 因为您希望数据在写出之前位于单个分区上。
为什么合并不起作用? Spark 限制合并期间的洗牌。因此,当您使用 coalesce 时,您无法执行完全洗牌(跨不同的工作人员),而当您使用重新分区时,您可以执行完全洗牌,尽管这是一项昂贵的操作。
下面是可用的代码:
dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)