impala系列: 同步Hive元数据和收集统计信息

时间:2024-04-10 12:36:40

---====================
-- Impala 获取hive 的 metadata
---====================
Impala 通常和Hive共用同一个metadata 数据库(通常是MySQL/PostgreSQL), 所以Impala 能够读取到Hive的元数据信息. 如果Impala需要访问Hive表, 需要将Hive metadata 刷新到impala中.

在Hive中Create/Drop表后, 或者HDFS rebalance,或者手工删除HDFS的文件后, 则需要在impala中执行下面两行命令:
INVALIDATE METADATA table_name;
describe table_name;
第一行命令 INVALIDATE METADATA 告诉impala 指定的 table 元数据已经过期, impala 将在下一次使用到该表时自动刷新元数据, 第二行命令即触发impala去更新元数据, 以免将来真正使用该表耗时太久.

如果Impala已经知道了Hive表的存在后, 又通过Hive增加或删除分区或alter table, 使用 refresh 命令即可更新元数据. refresh是对元数据进行增量更新, 和INVALIDATE METADATA相比, refresh命令使用成本低很多.
REFRESH table_name; --增量刷新全表
refresh [table_name] [PARTITION (key_col1=val1 [, key_col2=val2...])]]; --仅仅刷新指定分区

INVALIDATE METADATA 命令如果不指定表名, 则将所有表的元数据都标记为过期, 慎用!

---====================
-- 收集统计信息
---====================
Impala 仅仅能部分利用Hive的统计信息, 要想得到好的执行效率, impala需要收集统计信息.

1. 检查统计信息
show table stats table_name; --显示表和分区级别的统计信息.
如果返回第一列 #Rows 值-1, 表名还没有收集过统计信息.

show column stats table_name ; --显示列级别的统计信息.

2. 收集统计信息
Impala 的compute stats 一条命令同时采集表和字段两种信息, 使用起来非常方便.
它增量和全量两种写法, 在从未收集过统计信息的前提下, 并且数量一致的情况下, 使用COMPUTE STATS命令要比COMPUTE INCREMENTAL STATS速度更快. 所以对于非分区表, 推荐使用COMPUTE STATS.
COMPUTE STATS table_name ; -- 对于非分区表, 推荐使用COMPUTE STATS, 速度更快
COMPUTE INCREMENTAL STATS table_name ;--对于分区表, 推荐使用COMPUTE INCREMENTAL STATS, 速度更快一些.

如果table通过Hive增加了分区, 需要先进行refresh, 然后增量收集统计信息.
REFRESH table_name;
COMPUTE INCREMENTAL STATS table_name;

3. 删除统计信息
DROP STATS table_name
DROP INCREMENTAL STATS table_name PARTITION (key_col1=val1 [, key_col2=val2...])]