【问题标题】:Spark staging directory race condition when writing to hive partition?写入配置单元分区时,Spark 暂存目录竞争条件?
【发布时间】:2018-10-05 09:46:05
【问题描述】:

我在尝试将数据集写入配置单元表中的分区时看到间歇性异常。

Caused by: org.apache.hadoop.fs.FileAlreadyExistsException: /user/hive/warehouse/devl_fr9.db/fr9_ftdelivery_cpy_2_4d8eebd3_9691_47ce_8acc_b2a5123dabf6/.spark-staging-d996755c-eb81-4362-a393-31e8387104f0/date_id=20180604/part-00000-d996755c-eb81-4362-a393-31e8387104f0.c000.snappy.parquet for client 10.56.219.20 already exists

如果我检查 HDFS,则相关路径不存在。我只能假设这是关于临时暂存文件的一些竞争条件。我正在使用 Spark 2.3

【问题讨论】:

  • 问题解决了吗?当多个作业运行且集群负载过重时,我在集群中面临同样的问题。

标签: apache-spark hive apache-spark-sql


【解决方案1】:

此问题的一个可能原因是,在作业执行期间,任务开始将数据写入该文件并失败。

当一个任务失败时,它已经写入的数据是 Spark 的not deleted/purged(至少在 2.3 和 2.4 中确认)。因此,当另一个执行器尝试重新执行失败的任务时,它会尝试写入同名文件,并且您将收到 FileAlreadyExistsException。

在您的情况下,已经存在的文件称为 part-00000-d996755c-eb81-4362-a393-31e8387104f0.c000,因此您可能在 stderr 中有一条日志消息表明任务 00000 由于失败而丢失,例如

WARN TaskSetManager: Lost task **00000** in stage...

如果您解决了此失败的原因 - 可能是 OutOfMemoryError,如果问题是间歇性的 - FileAlreadyExistsException 可能会得到解决,因为任务不会失败并留下临时文件。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 2019-03-03
    • 2017-03-20
    相关资源
    最近更新 更多