文档首页/ 数据治理中心 DataArts Studio/ 常见问题/ 数据集成(实时作业)/ Hudi作为目的端时,同步过程中报错且报错信息包含“HoodieException: Duplicate fileID”怎么办?
更新时间:2025-11-03 GMT+08:00
分享

Hudi作为目的端时,同步过程中报错且报错信息包含“HoodieException: Duplicate fileID”怎么办?

问题描述

Hudi作为目的端时,Hudi表索引类型为BUCKET,作业进入“运行中”后报错,jobmanager、taskmanager中均有报错关键字“HoodieException: Duplicate fileID”。

图1 报错信息

查看Hudi表目录,可以看到问题分区下相同桶ID对应不同的FileID。

图2 Hudi表文件

原因分析

BUCKET索引的Hudi FileGroupId由 桶ID+UUID组成,桶ID与UUID一一对应,当有新的数据被写入到这个分区,发现一个桶ID对应多个UUID时会报错Duplicate fileID,表示Hudi表目录下有脏数据。

可能导致脏数据的原因:

  • 存在多个进程(Spark/Flink)同一时刻写了这张Hudi表。
  • 低版本MRS集群,通过Spark SQL的“insert overwrite”语法和“insert into xxx select * from”语法写Hudi表后,有概率在目录下留下脏数据文件。
  • 历史文件残留,或者有文件搬迁作业将脏数据文件直接搬迁到了目录下。

解决方案

  1. 通过OBS完成分区下数据备份,准备手动删除脏数据。
  2. 对于图2中的冲突文件,在Hudi表的.hoodie目录下分别搜索这两个文件的commit时间,即文件名末尾的时间戳【20250326094529742】和【20250326172153881】。

    图3 正常数据文件在Hudi表路径下能够搜索到关联的commit文件

    图4 脏数据文件在Hudi表路径下无法搜索到关联的commit文件

    能搜到的deltacommit文件的即为正常数据文件,搜不到时间戳的即为脏数据,脏数据文件手动删除即可。

    如果两个时间戳都搜不到关联commit,那可能是commit文件已经被归档,需要将.hoodie/archive目录下的归档文件下载下来,通过vi命令搜索,同样的,能搜索到commit记录的为正常数据文件,搜索不到commit记录的是脏数据文件,需要手动删除。

    图5 搜索commit记录

    图6 vi命令搜索

  3. 在本章节,图2所展示的两个冲突文件,00000000-3d29-44d4-b603-47c36a23d406_1-12-45_20250326094529742.parquet文件可以搜索到关联的commit记录(20250326094529742),为正常的数据文件,需要被保留;

    而相反00000000-419f-4468-a249-ca6c3c86b1db-00_0-6-16_20250326172153881.parquet无法搜索到与时间戳20250326172153881关联的commit记录,为脏数据文件,需要被删除。

    用户可以登录到OBS,自行手动删除脏数据文件。

相关文档