在tez和map reduce中运行“count(*)时的行为差异

hpcdzsge  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(496)

最近我遇到了这个问题。我在hadoop分布式文件系统路径和相关的hive表中有一个文件。这张table两边有30个隔板。
我从hdfs中删除了5个分区,然后执行 "msck repair table <db.tablename>;" 在 hive 的table上。它完成得很好,但是输出了
“文件系统缺少分区:”
我试过跑步 select count(*) <db.tablename>; (在tez上)失败,错误如下:
原因:java.util.concurrent.executionexception:java.io.filenotfoundexception:
但是当我把hive.execution.engine设置为 "mr" 并被处决 "select count(*) <db.tablename>;" 它工作得很好,没有任何问题。
我现在有两个问题:
这怎么可能?
如何同步配置单元元存储和hdfs分区?对于上述情况(我的配置单元版本是“hive1.2.1000.2.6.5.0-292”。)
提前谢谢你的帮助。

zd287kbt

zd287kbt1#

MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS]; 这将把有关分区的元数据更新到尚未存在此类元数据的分区的配置单元元存储区。msc命令的默认选项是addpartitions。使用此选项,它将把hdfs上存在但不在metastore中的任何分区添加到metastore中。droppartitions选项将从metastore中删除已经从hdfs中删除的分区信息。sync partitions选项相当于同时调用add和drop分区。
但是,这仅在配置单元版本3.0中可用。。见-hive-17824
在您的例子中,版本是hive1.2,下面是在metastore中同步hdfs分区和表分区的步骤。
直接从hdfs中删除相应的5个分区,方法如下 ALTER 声明。 ALTER TABLE <db.table_name> DROP PARTITION (<partition_column=value>);SHOW PARTITIONS <table_name>; 并查看分区列表是否已刷新。
这应该像在hdfs中一样同步hms中的分区。
或者,您可以删除并重新创建表(如果是外部表),执行 MSCK REPAIR 在新创建的表上。因为删除外部表不会删除基础数据。
注意:默认情况下, MSCK REPAIR 只会将hdfs中新添加的分区添加到hive metastore,而不会从hive metastore中删除那些已在hdfs中手动删除的分区。

为了避免以后执行这些步骤,最好直接使用 ALTER TABLE <table_name> DROP PARTITION (<partition_column=value>) 从Hive里。

相关问题