0758-5.16.2-Impala的invalidate与refresh介绍

Posted Hadoop实操

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0758-5.16.2-Impala的invalidate与refresh介绍相关的知识,希望对你有一定的参考价值。

审核:黄权隆

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

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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍



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


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

0758-5.16.2-Impala的invalidate与refresh介绍



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

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

执行成功,刷新表成功

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


4.2 invalidate权限测试

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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍


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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


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

0758-5.16.2-Impala的invalidate与refresh介绍

0758-5.16.2-Impala的invalidate与refresh介绍

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


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

0758-5.16.2-Impala的invalidate与refresh介绍


12.test用户执行invalidate metadata命令

0758-5.16.2-Impala的invalidate与refresh介绍

执行失败


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

0758-5.16.2-Impala的invalidate与refresh介绍


14.test用户执行invalidate metadata命令

0758-5.16.2-Impala的invalidate与refresh介绍

命令执行成功


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

以上是关于0758-5.16.2-Impala的invalidate与refresh介绍的主要内容,如果未能解决你的问题,请参考以下文章

当在命令行中执行virtualenv venv时报此错误:'utf-8' codec can't decode byte 0xd5 in position 38: invali

Android面试题

多个异步请求

表单验证电子邮件

UITableView 行删除崩溃应用

[Django学习]分页