跨集群拷贝Hive分区表出现带.tmp后缀分区及多余分区问题咨询
问题根因分析
带.tmp~!@后缀路径的产生原因
distcp执行过程中会默认在目标路径下生成带.tmp前缀加随机后缀的临时目录,用于存储未完成拷贝的文件块,任务执行成功后会自动将临时目录重命名为正式目录,若任务因网络波动、集群资源不足、超时被kill等异常中断,临时目录会直接残留在目标路径下,不会被自动清理。- 若
distcp执行时,原集群刚好在对该Hive表做分区写入、修改操作,原集群侧的临时写入文件(Hive写入时默认生成./_开头的临时目录)也会被distcp全量扫描拷贝到目标集群,产生异常后缀路径。 - 你未配置定时任务的前置清理、后置校验逻辑,多次执行的残留临时文件会不断累积,甚至被后续
distcp任务当成合法路径重复拷贝。
原集群不存在的异常分区产生原因
- Hive会自动扫描表存储路径下所有符合
分区键=分区值命名规则的目录,若残留的临时目录刚好匹配该格式(如dt=20240601.tmp~!@),即使你未执行msck repair table,若开启了hive.metastore.partition.inference.enabled配置(Hive 3.x及以上版本默认开启),这些异常目录会被自动识别成分区加载到元数据,形成原集群不存在的分区。 - 若你的
distcp命令使用了-update/-overwrite增量同步参数,但未搭配-delete参数,目标集群中已经存在、但原集群已经删除的旧分区不会被清理,长期累积就会出现大量原集群不存在的冗余分区。
规避方案
- 执行
distcp时添加过滤规则,跳过所有./_开头的隐藏临时路径,命令示例:distcp -filters <(echo -e "regex .*/\\..*$\nregex .*/_.*$") hdfs://源集群路径 hdfs://目标集群路径 - 定时任务增加执行结果校验,仅在
distcp返回成功状态后,执行目标路径下临时目录的清理操作,删除所有带.tmp后缀的异常路径。 - 若需要保证目标集群和原集群表数据完全一致,
distcp添加-delete参数,自动删除目标路径中源集群不存在的冗余文件/目录。 - 定期执行
msck repair table <表名> drop partitions清理元数据中已不存在的异常分区。
内容的提问来源于stack exchange,提问作者RRy
相关产品推荐
相关产品推荐

