【问题标题】:Databricks Checksum error while writing to a file写入文件时出现 Databricks 校验和错误
【发布时间】:2019-07-16 03:30:49
【问题描述】:

我正在 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 以某种方式失败并产生校验和错误。

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

【问题讨论】:

  • 没有合并可以工作吗?合并很容易导致内存问题,而且错误通常不是很有帮助。
  • 尝试重新分区而不是合并。 dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)
  • Bob Swain 同样的错误,即使没有合并。 @Rob 这确实有效,但我不明白为什么。您能否将其发布为包含更多详细信息的答案?
  • @FlavioDiasPs 已经发布了答案,希望对您有所帮助。

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


【解决方案1】:

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

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

  2. repartition 的作用是对数据进行洗牌以增加/减少总分区的数量。在您的情况下,如果您有多个工作人员并且需要单个输出,则必须使用 repartition(1) ,因为您希望数据在写出之前位于单个分区上。

    李>

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

下面是可行的代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多