Tez 和 Map reduce 中 运行 "count(*) " 时的行为差异

Diffrence in behaviour while running "count(*) " in Tez and Map reduce

最近我遇到了这个问题。我在 Hadoop 分布式文件系统路径和相关配置单元 table 中有一个文件。 table 两侧各有 30 个分区。

我从 HDFS 中删除了 5 个分区,然后在配置单元 table 上执行了 "msck repair table <db.tablename>;"。它完成得很好但输出了

"Partitions missing from filesystem:"

我试过 运行 select count(*) <db.tablename>;(在 tez 上)失败并出现以下错误:

Caused by: java.util.concurrent.ExecutionException: java.io.FileNotFoundException:

但是当我将 hive.execution.engine 设置为 "mr" 并执行 "select count(*) <db.tablename>;" 时,它工作正常,没有任何问题。

我现在有两个问题:

  1. 这怎么可能?

  2. 如何同步 hive metastore 和 hdfs 分区?为了 以上案例。(我的蜂巢版本是“Hive 1.2.1000.2.6.5.0-292”。)

在此先感谢您的帮助。

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

这会将有关分区的元数据更新到 Hive 元存储,以用于尚不存在此类元数据的分区。 MSC 命令的默认选项是 ADD PARTITIONS。使用此选项,它会将 HDFS 上存在但不在 Metastore 中的任何分区添加到 Metastore。 DROP PARTITIONS 选项将从 Metastore 中删除分区信息,该信息已从 HDFS 中删除。 SYNC PARTITIONS 选项相当于同时调用 ADD 和 DROP PARTITIONS。

但是,这仅适用于 Hive 3.0 版。请参阅 - HIVE-17824

在你的例子中,版本是 Hive 1.2,下面是在 Metastore 中同步 HDFS 分区和 Table 分区的步骤。

  1. 使用下面的ALTER语句直接从HDFS删除相应的5个分区。

ALTER TABLE <db.table_name> DROP PARTITION (<partition_column=value>);

  1. 运行 SHOW PARTITIONS <table_name>; 查看分区列表是否刷新。

这应该像在 HDFS 中一样同步 HMS 中的分区。

或者,您可以删除并重新创建 table(如果它是外部 table),对新创建的 table 执行 MSCK REPAIR。因为删除外部 table 不会删除基础数据。

注意:默认情况下,MSCK REPAIR只会将HDFS中新添加的分区添加到Hive Metastore,不会从Hive Metastore中删除HDFS中手动删除的分区。

====

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