前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍

作者头像
Fayson
发布2020-04-21 15:24:04
2K0
发布2020-04-21 15:24:04
举报
文章被收录于专栏:Hadoop实操Hadoop实操

作者:段自强

审核:黄权隆

修订:Fayson

Impala元数据简介

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来说较为轻量的的刷新,他的语法是:

代码语言:javascript
复制
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的特点是同步性和增量性。并且,它的执行是围绕单表以及单表的分区进行的,因此它更轻量级,也更适合分区元数据或数据文件更改之后的刷新。另外在hive里新建的表在impala里是无法使用refresh的。

invalidate

1.invalidate意思是“使无效,废除”,因此invalidate metadata的含义就是“废除(缓存的)元数据”,他的语法是:

代码语言:javascript
复制
invalidate metadata               --重新生成所有表元数据
invalidate metadata [table]       --重新生成table表的元数据

2.invalidate的执行过程

  • invalidate metadata的时候,impalad向catalogd发起无参的resetMetadata请求,表示清空所有元数据,待被使用时才异步加载
  • invalidate metadata table的时候,其中一个impala Daemon获取到表table,对catalogd发起resetMetadata请求
  • catalog收到该请求,执行invalidateTable操作,清除所有与table相关的元数据缓存,重新读取Metastore中的 元数据,并生成新的缓存。但是此时生成的缓存只包含库名和表名,是不完整的
  • catalog再生成一个标记缓存的版本号,将这个IncompleteTable 缓存和版本号一起返回给impala Daemon,然后继续异步加载其余的元数据
  • impala Daemon收到catalogd返回的不完整缓存和版本号,用它来更新本地缓存。

这里同样要注意:在刚执行完时,除了执行刷新操作的impala Daemon之外的其他impala Daemon仍然保有旧的元数据缓存,就算此节点保有的新元数据也是残缺的。只有当catalog异步加载完了table对应的所有元数据 ,才会生成一个更新的版本号,并将完整的元数据通过statestore广播给所有impala Daemon,整个Impala集群的元数据感知才会达到一致。

注:只有设置了启动参数 –load_table_in_background=true 才会异步加载元数据。CM默认会加这个参数,建议大集群中设为false。否则对于大集群可能启动时间非常长,甚至几个小时都启动不完。

3.invalidate的特点

invalidate metadata的特点就是异步性和全量性。但是它涉及到大批量元数据的更改,所以较为消耗资源和时间。

元数据刷新的权限控制

4.1refresh权限测试

1.用管理员用户给一张表赋予select 权限,并把test用户所在的组加入此权限的角色

2.用test用户执行refresh [table]命令

执行失败,无权限执行命令

3.用管理员用户给一张表赋予insert权限,并把test用户所在的组加入此权限的角色

4.用test用户执行refresh [table]命令

执行失败,无权限执行命令

5.用管理员用户给一张表所在的数据库赋予create权限,并把test用户所在的组加入此权限的角色

6.用test用户执行refresh [table]命令

执行失败,无权限执行命令

7.用管理员用户给一张表赋予refresh权限,并把test用户所在的组加入此权限的角色

8.test用户执行refresh [table]命令

9.用管理员用户给一张表赋予all权限,并把test用户所在的组加入此权限的角色

10.test用户执行refresh [table]命令

执行成功,刷新表成功

说明只有拥有该表的REFRESH权限的用户才能执行refresh [table]操作。

4.2 invalidate权限测试

1.用管理员用户给一张表赋予select 权限,并把test用户所在的组加入此权限的角色

2.用test用户执行invalidate metadata [table]和invalidate metadata命令

执行失败,无权限执行命令

3.用管理员用户给一张表赋予insert权限,并把test用户所在的组加入此权限的角色

4.用test用户执行invalidate metadata [table]和invalidate metadata命令

执行失败,无权限执行命令

5.用管理员用户给一张表所在的数据库赋予create权限,并把test用户所在的组加入此权限的角色

6.用test用户执行invalidate metadata [table]和invalidate metadata命令

执行失败,无权限执行命令

7.用管理员用户给一张表赋予refresh权限,并把test用户所在的组加入此权限的角色

8.test用户执行invalidate metadata [table]和invalidate metadata命令

invalidate metadata [table]执行成功,刷新表成功,invalidate metadata执行失败,无权限执行命令

9.用管理员用户给一张表赋予all权限,并把test用户所在的组加入此权限的角色

10.test用户执行invalidate metadata [table]和invalidate metadata命令

invalidate metadata [table]执行成功,刷新表成功,invalidate metadata执行失败,无权限执行命令

11.用管理员用户给这张表所在数据库赋予all权限,并把test用户所在的组加入此权限的角色

12.test用户执行invalidate metadata命令

执行失败

13.用管理员用户给server赋予all权限,并把test用户所在的组加入此权限的角色

14.test用户执行invalidate metadata命令

命令执行成功

15.用管理员用户给server赋予refresh权限,并把test用户所在的组加入此权限的角色

16.test用户执行invalidate metadata命令

命令执行成功

说明对于invalidate metadata命令,只有拥有server的refresh和server的all权限的用户才可以执行成功。对于invalidate metadata [table]命令,必须拥有该表refresh权限才可以执行成功。

4.3 总结

1.如果hive中发生了增删表行为,如create table、drop table,就使用invalidate metadata [table]语句。

2.如果hive中某表加入了新数据,或者有分区的改动,或者改变表结构的行为,如load data、alter table add partition、alter table add column等,就使用refresh [table] partition [partition]语句。

3.需要执行invalidate metadata操作的用户,必须赋予其所有表的REFRESH权限,不然无法执行成功。

4.只有拥有该表的REFRESH权限的用户才可以对该表进行invalidate metadata [table]和refresh [table]操作。

使用场景建议

1.因为invalidate本身是一个比较重的操作,它会清空所有元数据缓存,而只是加载所有IncompleteTable缓存,后面的查询在请求具体某张table的时候才会去重新加载全部的完整元数据,所以会对后面的查询有影响。因此我们应尽量避免直接使用invalidate metadata的操作,改为invalidate [table]或者使用refresh命令。

2.对于Impala的开发用户,企业内部可以进行invalidate和refresh命令使用的相关规范指引,配合以审计来完善管理流程。或者通过Sentry的权限控制只是将invalidate和refresh的命令开放给部分用户。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档