作者:段自强
审核:黄权隆
修订:Fayson
Impala元数据简介
![9bc6f47fef5460b6ba675d6120937cae.png](https://i-blog.csdnimg.cn/blog_migrate/1e80666d6508535edb9ff5834979aae5.jpeg)
Impala并没有保存自己元数据的后端的关系型数据库,它通过连接到Hive Metastore来获取元数据并缓存到Catalog Server,如大家所知,Hive Metastore则是连接后端的MySQL关系型数据库。Catalog Server除了缓存Hive Metastore的数据,同时还会找NameNode和Sentry Server去拉取HDFS文件路径相关元数据,以及安全策略的元数据,随后将其压缩并发送到Statestore以广播给所有Impala Daemon,如果做了Coordinator和Executor分离,则Statestore只广播给Coordinator。
Impala这种架构也是尽可能的提升查询性能,尤其相比Hive SQL或者Spark SQL,因为比如一个表具有大量数据同时包含大量分区,检索该表的所有元数据可能非常耗时,有时可能需要几分钟。因此Impala节点都会缓存这些元数据,以便查询需要访问元数据时可以直接从内存中读取。
如果表定义或者表中的数据被更新,则集群中所有的Impala Daemon必须接收最新的元数据以替换旧的元数据,然后对这个表的查询才是正确的 。从Impala1.2开始,这个元数据更新是自动的,如果是通过Impala发起的DDL和DML语句,Catalog Server会将新的元数据 发布给Statestore,然后广播给所有的Impala Daemon节点,实现元数据的自动更新。
如果是通过Hive发出的DDL和DML,或者对HDFS底层的文件进行了手动更改,你需要手动更新Impala的元数据,如果是给一张表添加了新数据,可以通过REFRESH命令,如果是新建一张表或者删除整表,则可以通过INVALIDATE METADATA命令来更新元数据。INVALIDATE METADATA会去找HMS重新获取完全的元数据 (注意该操作是异步的,是异步逐步加载所有元数据还是查询时才获取通过参数设置,下面章节会说明),如果你知道只是更新了某一张表,你可以通过命令REFRESH table_name只是刷新该表的元数据。
本文主要详细介绍INVALIDATE和REFRESH命令,以及两者的区别,最后会给出总结。
- 测试环境
1.Redhat7.4
2.CDH5.16.2
3.集群已启用Kerberos+Sentry
refresh
1.refresh在impala中是相对invalidate来说较为轻量的的刷新,他的语法是:
refresh [table] --刷新table表的元数据refresh [table] partition [partition] --刷新table表partition分区的元数据
2.refresh的执行过程
- refresh table的时候,其中一个impala Daemon首先对catalogd发起resetMetadata请求
- catalogd收到该请求:对指定了partition的请求,执行reloadPartition操作,获取该分区最新的元数据并刷新;对未指定partition的请求,执行reloadTable操作,获取全部分区最新的元数据并刷新。这里的“刷新”是指Metastore中与缓存对比如果没有变化,就保持原状;如果有增删改,才会发生改变
- impala Daemon收到catalog返回的完整缓存,用它来更新本地缓存。
这里要注意的是:statestored仍会负责广播新的元数据到其他节点。在广播完之前,除了已经执行刷新的impala Daemon之外的其他impala Daemon依旧保有旧的缓存。
3.refresh特点
refresh的特点是同步性