元存储中的配置单元分区,但hdfs中不存在路径

a0x5cqrl  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(350)

我们的摄取过程有一个问题,会导致分区被添加到配置单元中的表中,但hdfs中的路径实际上并不存在。我们已经解决了这个问题,但是仍然有这些坏分区。当使用tez查询这些表时,我们得到filenotfoundexception,指向hdfs中不存在的位置。如果我们使用mr而不是tez,查询可以工作(这让我很困惑),但是太慢了。
有没有办法列出所有有这个问题的分区? MSCK REPAIR 似乎处理了相反的问题,数据存在于hdfs中,但在hive中没有分区。
编辑:更多信息。以下是文件未找到异常的输出: java.io.FileNotFoundException: File hdfs://<server>/db/tables/2016/03/14/mytable does not exist. 如果我跑了 show partitions <db.mytable> ,我会得到所有的分区,包括一个 dt=2016-03-14 . show table extended like '<db.mytable>' partition(dt='2016-03-14' 返回相同的位置: location:hdfs://server/db/tables/2016/03/14/mytable .

ckx4rj1h

ckx4rj1h1#

好像 MSCK REPAIR TABLE 不会删除指向丢失目录的分区,但会列出这些分区(请参阅 Partitions not in metastore: ),因此只需编写一点脚本/手动操作,就可以根据给定的列表删除它们。

hive> create table mytable (i int) partitioned by (p int);
OK
Time taken: 0.539 seconds

hive> !mkdir mytable/p=1;
hive> !mkdir mytable/p=2;
hive> !mkdir mytable/p=3;

hive> msck repair table mytable;
OK
Partitions not in metastore:    mytable:p=1 mytable:p=2 mytable:p=3
Repair: Added partition to metastore mytable:p=1
Repair: Added partition to metastore mytable:p=2
Repair: Added partition to metastore mytable:p=3
Time taken: 0.918 seconds, Fetched: 4 row(s)

hive> show partitions mytable;
OK
p=1
p=2
p=3
Time taken: 0.331 seconds, Fetched: 3 row(s)

hive> !rmdir mytable/p=1;
hive> !rmdir mytable/p=2;
hive> !rmdir mytable/p=3;

hive> msck repair table mytable;
OK
Partitions missing from filesystem: mytable:p=1 mytable:p=2 mytable:p=3
Time taken: 0.425 seconds, Fetched: 1 row(s)

hive> show partitions mytable;
OK
p=1
p=2
p=3
Time taken: 0.56 seconds, Fetched: 3 row(s)
qlckcl4x

qlckcl4x2#

MSCK REPAIR TABLE <tablename> 我也面临同样的问题,我找到了解决办法,
我们知道'msck repair'命令基于目录添加分区,所以首先删除所有分区

hive>ALTER TABLE mytable drop if exists partitions(p<>'');

上面的命令删除所有分区,
然后使用 msck repair 命令,然后它将从表位置的目录创建分区。

hive>msck repair table mytable

相关问题