返回 导航

大数据

hangge.com

Impala - 解决Hive新增表在Impala查不到问题(invalidate metadata命令)

作者:hangge | 2024-10-18 08:44

1,问题描述

(1)首先我在 Hive 这边使用如下命令创建一张 user 表:
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,问题原因

    这是由于元数据不同步造成的。虽然,HiveImpala 使用相同的元数据存储(通常是 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)

回到顶部