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>;"
时,它工作正常,没有任何问题。
我现在有两个问题:
这怎么可能?
如何同步 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 分区的步骤。
- 使用下面的
ALTER
语句直接从HDFS删除相应的5个分区。
ALTER TABLE <db.table_name> DROP PARTITION (<partition_column=value>);
- 运行
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 中直接删除分区。
最近我遇到了这个问题。我在 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>;"
时,它工作正常,没有任何问题。
我现在有两个问题:
这怎么可能?
如何同步 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 分区的步骤。
- 使用下面的
ALTER
语句直接从HDFS删除相应的5个分区。
ALTER TABLE <db.table_name> DROP PARTITION (<partition_column=value>);
- 运行
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 中直接删除分区。