和impala_0758-5.16.2-Impala的invalidate与refresh介绍

作者:段自强

审核:黄权隆

修订:Fayson

Impala元数据简介

9bc6f47fef5460b6ba675d6120937cae.png

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

invalidate

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

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用户所在的组加入此权限的角色

07d33661eed2a8259f9310c1c361f011.png

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

674b22b506003da3f351fdd6c22bee4a.png

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

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

977a5e39f4a69abf8e836855d698cf1e.png

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

674b22b506003da3f351fdd6c22bee4a.png

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

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

745b8fba006fa2102550261ebc5a5f95.png

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

674b22b506003da3f351fdd6c22bee4a.png

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

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

48a780d37a40323e95e54970518bfbd7.png

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

c7f6d66e6e0b52c9911f0fcdd0adb6ea.png

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

5bc3fe2f50be3ca1f033bf443374b222.png

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

c7f6d66e6e0b52c9911f0fcdd0adb6ea.png

执行成功,刷新表成功

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

4.2 invalidate权限测试

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

07d33661eed2a8259f9310c1c361f011.png

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

507508c8fd1bcd9fa5b8cbf8671230c9.png
99b3c120ce12e3292377165292e17b0c.png

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

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

977a5e39f4a69abf8e836855d698cf1e.png

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

507508c8fd1bcd9fa5b8cbf8671230c9.png
99b3c120ce12e3292377165292e17b0c.png

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

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

745b8fba006fa2102550261ebc5a5f95.png

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

507508c8fd1bcd9fa5b8cbf8671230c9.png
99b3c120ce12e3292377165292e17b0c.png

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

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

48a780d37a40323e95e54970518bfbd7.png

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

d67ff109002325950f5c0ef4e6a98a51.png
99b3c120ce12e3292377165292e17b0c.png

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

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

5bc3fe2f50be3ca1f033bf443374b222.png

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

d67ff109002325950f5c0ef4e6a98a51.png
99b3c120ce12e3292377165292e17b0c.png

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

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

95731156c6591d1ab1736c0efc3a75ff.png

12.test用户执行invalidate metadata命令

321f0a5c05a1a3776bb6535185523b53.png

执行失败

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

602874a5390443ff5dfd5b08f560c61a.png

14.test用户执行invalidate metadata命令

c444371487b81309deaba92e945d9480.png

命令执行成功

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

267d17bebe44203bf115090512ff7593.png

16.test用户执行invalidate metadata命令

c444371487b81309deaba92e945d9480.png

命令执行成功

说明对于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的命令开放给部分用户。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值