Impala metadata 刷新

Impala 在传统的MYSQL 或 PostgreSQL 数据库称为 Metastore 上保持其表定义,Hive 也在相同的数据库上保存此类型的数据。因此,Impala 可以访问由 Hive 定义或加载的表。
对于具有大量数据或多个分区的表,检索表内所有元数据可能会花费很长时间,在某些情况下需要几分钟。因此,每个 Impala 节点缓存所有这些数据,以便在未来对同一表进行查询时重复使用。
如果更新表定义或表数据,集群中所有其他Impala Daemon必须接收到最新的元数据、更换过时的缓存元数据,然后再对该表发出查询。

1、元数据缓存

在Impala里面存在元数据的缓存。元数据保存在Hive的Metastore里面,在Impala启动的时候,会将元数据缓存到Impala daemon的节点。当Impala daemon发起元数据变更的时候,比如说创建表,删除表,或者修改表的定义,这些都是可以缓存下来的。如果我们去查询表信息的时候,可以从缓存里面找到,直接在节点中进行查询,所以在每个Impala daemon里面有metadata cache节点用作缓存。而当Impala进程改变了元数据,将会提示catalog服务,Catalog服务通知所有Impala daemons来更新缓存。

2、外部改变和元数据缓存

上面讲的都是内部的改变,然而很多时候还会有外部的改变,可外部的改变对于Impala来说是未知的,比如:
(1)Hive、Hcatalog或HueMetadata Manager改变了元数据
(2)数据直接添加到HDFS目录
外部的改变将导致Impala元数据缓存变得不可用,我们必须手动的刷新或验证Impala的元数据缓存。
当然,这种改变根据改变内容和性质的不同,有不同的方法去更新,比如:

(1)INVALIDATE METADATA 语句

在默认情况下INVALIDATE METADATA操作会刷新所有表的缓存元数据。与由 REFRESH 语句执行的元数据增量更新相比INVALIDATE METADATA是一项需要耗费大量资源的操作。如果指定了一个表名称,INVALIDATE METADATA只刷新用于该表的元数据。但是!即使对于单个表,INVALIDATE METADATA 也要比 REFRESH 耗费更多资源。

(2)REFRESH 语句

必须加表名参数。 REFRESH table_name 只适用于 Impala 已识别的表。在 Impala (而不是 Hive) 中运行 ALTER TABLE、INSERT 或其他修改表的语句之后,Impala 节点的元数据不需要手动更新。
定时刷新:

#!/bin/sh
echo "***********"`date`"**************"
echo "***********  refresh impala meta info"  **************
start=$(date +%s)
dbFile=impala.db
impala-shell --quiet  --output_delimiter="|" -q "show databases;" -B -o $dbFile
cat $dbFile | while read line
do
    db=${line%%|*}
    tbFile=$db.tb
    impala-shell --quiet  --output_delimiter="|" -q "use $db;show tables;" -B -o $tbFile
    cat $tbFile | while read tb
    do
        echo $db.$tb
        impala-shell --quiet   -B -q "refresh $db.$tb ;"
    done
done
#impala-shell -q "invalidate metadata;"
end=$(date +%s)
echo $((end-start))

你可能感兴趣的:(Impala)