当HDFS中的分区数据被手动删除时,如何更新Hive中的分区元数据

30

自动更新Hive分区表元数据的方法是什么?

如果向HDFS添加了新的分区数据(未执行alter table add partition命令),那么我们可以通过执行“msck repair”命令来同步元数据。

如果从HDFS中删除了大量分区数据(未执行alter table drop partition命令),应该怎么做?

同步Hive元数据的方法是什么?

3个回答

42

编辑:从Hive 3.0.0开始,MSCK现在可以使用以下语法发现新的分区或删除丢失的分区(或两者都有):

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]

这是在 HIVE-17824 中实现的。


正如HakkiBuyukcengiz所述,MSCK REPAIR不能删除在HDFS上手动删除的分区对应的文件夹,它只添加新的文件夹对应的分区。

官方文档摘录如下:

换句话说,它会将存在于HDFS但不在metastore中的任何分区添加到metastore中。

当我在存在外部表的情况下在HDFS上手动删除多个分区文件夹并且想要快速刷新分区时,我通常会执行以下操作:

  • 删除表 (DROP TABLE table_name) (删除外部表不会删除底层的分区文件)
  • 重新创建表 (CREATE EXTERNAL TABLE table_name ...)
  • 修复它 (MSCK REPAIR TABLE table_name)

根据分区数量的不同,这可能需要很长时间。另一个解决方案是对每个删除的分区文件夹使用ALTER TABLE DROP PARTITION (...),但如果删除了多个分区,则可能会很繁琐。


1
如果表是“MANAGED_TABLE”呢? - Nanor
@Nanor MSCK 命令也会处理托管表的分区。 - Vinod Singh
感谢这个解决方案的帮助,删除表并重新创建! - Aru

18

试着使用

MSCK REPAIR TABLE <tablename>;

16
Msck不能删除文件系统中不存在目录的分区,它只会通知哪些分区下的目录在文件系统中不存在。你需要手动运行 "alter table drop partition..." 命令来删除这些分区。 - HakkiBuyukcengiz

6

确保表已设置为外部表,删除所有分区,然后运行表修复:

alter table mytable_name set TBLPROPERTIES('EXTERNAL'='TRUE')
alter table mytable_name drop if exists partition (`mypart_name` <> 'null');
msck repair table mytable_name;


如果msck repair报错,则可以通过以下方式在终端中运行hive:
hive --hiveconf hive.msck.path.validation=ignore
或者 set hive.msck.path.validation=ignore;


这是对我有效的方法。仅尝试修复表并不足够,在我的Hive版本中至少如此。 - Sizzin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接