Impala - 解决Hive新增表在Impala查不到问题(invalidate metadata命令)
作者:hangge | 2024-10-18 08:44
1,问题描述
(1)首先我在 Hive 这边使用如下命令创建一张 user 表:
(2)接着往表中导入一些数据:
(3)然后在 Hive 这边是可以正常查询到数据:
create table user( id int, name string, age int, online boolean ) row format delimited fields terminated by '\t' lines terminated by '\n';
(2)接着往表中导入一些数据:
load data local inpath 'user.txt' into table user;
- 数据文件 user.txt 里面的内容如下:
1 张三 22 true 2 李四 25 false 3 航歌 33 true 4 王五 99 false
(3)然后在 Hive 这边是可以正常查询到数据:
select * from user;
(4)而使用 Impala 查询时会报无法找到表错误:
ERROR: AnalysisException: Could not resolve table reference: 'user
(5)Impala 这边使用 show tables; 命令也看不到 Hive 刚创建的表。
2,问题原因
这是由于元数据不同步造成的。虽然,Hive 和 Impala 使用相同的元数据存储(通常是 Hive Metastore),但是 Impala 的元数据缓存没有同步更新。
3,解决办法
(1)我们可以在 Impala 执行如下命令刷新指定表的元数据缓存:
INVALIDATE METADATA user;
(2)或者干脆不指定表,直接刷新所有的元数据缓存:
INVALIDATE METADATA;
(3)再次查询可以发现表已经存在了:
附:refresh 命令与 invalidate metadata 命令对比
1,性能比较
(1)refresh 命令负责重新加载指定表的最新元数据信息,以及增量加载表中新的数据文件的位置信息,这个操作可以认为是增量更新,所以说他是轻量级的,性能开销较小。
(2)invalidate metadata 命令可以将表的元数据标记为过期,它会重新加载这个表的所有元数据信息,属于全量更新,性能开销较大。
invalidate metadata 命令后面可以指定表名,也可以不指定表名:
- 如果不指定表名,则 Impala 中缓存的所有表的元数据信息都会被标记为过期。
- 如果指定了表名,则只会将指定的表的元数据信息标记为过期。
2,使用建议
(1)针对单张表而言,invalidate metadata 的性能开销也比 refresh 要高。在向表中添加了数据文件之后,建议优先使用 refresh。
(2)如果不确定哪个表的元数据发送了变化,想要全量更新表的元数据信息,建议使用 invalidate metadata,这样比较方便,此时就不考虑性能开销了。
全部评论(0)