0

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

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

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

但是我收到了这个例外:

py4j.protocol.Py4JJavaError:调用 o106.save 时出错。: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 at 0 exp:1179219224 得到:-1020415797

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

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

4

1 回答 1

1

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

  1. 合并所做的是它本质上结合了每个工人的分区。例如,如果您有 3 个 worker,您可以执行 coalesce(3) 来合并每个 worker 上的分区。

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

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

这是可行的代码:

dfLogging.repartition(1).write.format('delta').mode('append').save('/dbfs/' + loggingLocation)
于 2019-07-15T19:30:49.673 回答