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元数据缓存变得不可用,