写入文件时出现Databricks校验和错误

时间:2019-07-12 19:30:46

标签: apache-spark error-handling pyspark azure-databricks delta-lake

我正在9个节点上运行作业。

所有人都将向文件中写入一些信息,如下所示:

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

但是我收到此异常:

  

py4j.protocol.Py4JJavaError:调用时发生错误   o106。保存。 :java.util.concurrent.ExecutionException:   org.apache.spark.SparkException:由于阶段失败,作业中止了:   14.0阶段中的任务1失败1次,最近一次失败:丢失的任务   14.0阶段的1.0(TID 259,本地主机,执行程序驱动程序):org.apache.hadoop.fs.ChecksumException:校验和错误:   文件:/dbfs/delta/Logging/_delta_log/00000000000000000063.json在0   exp:1179219224得到了:-1020415797

在我看来,由于并发性,spark某种程度上失败了,并且会生成校验和错误。

是否存在可能导致这种情况的已知情况?

1 个答案:

答案 0 :(得分:1)

因此,发生了几件事情,它应该解释为什么合并可能不起作用。

  1. 合并的作用实际上是将每个工作程序上的分区合并在一起。例如,如果您有三个工作人员,则可以执行Coalesce(3)合并每个工作人员上的分区。

  2. 重新分区的作用是重新整理数据以增加/减少总分区数。在您的情况下,如果您有多个工作线程,并且需要单个输出,则必须使用repartition(1),因为您希望在写入之前将数据放在单个分区上。

为什么合并不起作用? 火花限制了合并期间的混洗。因此,在使用合并时,您无法执行跨不同工作人员的完整改组,而在使用分区时,您可以进行完整的改编,尽管这是一项昂贵的操作。

以下是适用的代码:

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