前言

Impala采用了比较奇葩的多个impalad同时提供服务的方式,并且它会由catalogd缓存全部元数据,再通过statestored完成每一次的元数据的更新到impalad节点上,Impala集群会缓存全部的元数据,这种缓存机制就导致通过其他手段更新元数据或者数据对于Impala是无感知的,例如通过hive建表,直接拷贝新的数据到HDFS上等,Impala提供了两种机制来实现元数据的更新,分别是INVALIDATE METADATA和REFRESH操作,本文将详细介绍这两个操作。

使用方式
INVALIDATE METADATA是用于刷新全库或者某个表的元数据,包括表的元数据和表内的文件数据,它会首先清楚表的缓存,然后从metastore中重新加载全部数据并缓存,该操作代价比较重,主要用于在hive中修改了表的元数据,需要同步到impalad,例如create table/drop table/alter table add columns等。

INVALIDATE METADATA 语法:

INVALIDATE METADATA; //重新加载所有库中的所有表
INVALIDATE METADATA [table] //重新加载指定的某个表
1
2
REFRESH是用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作,它能够检测到表中分区的增加和减少,主要用于表中元数据未修改,数据的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION等,如果直接修改表的HDFS文件(增加、删除或者重命名)也需要指定REFRESH刷新数据信息。

REFRESH 语法:

REFRESH [table] //刷新某个表
REFRESH [table] PARTITION [partition] //刷新某个表的某个分区
1
2
INVALIDATE METADATA原理
对于INVALIDATE METADATA操作,由客户端将查询提交到某个impalad节点上,执行如下的操作:

1.获取需要执行INVALIDATE METADATA的表,如果没指定表则不设置表示全部表(不考虑这种情况)。
2.请求catalogd执行resetMetadata操作,并将isFresh参数设置为false。
3.catalogd接收到该请求之后执行invalidateTable操作,将该表的缓存清除,然后重新生成该表的缓存对象,新生成的对象只包含表名+库名的信息,为新生成的表对象生成一个新的catalog版本号(假设新的version=1),将这部分信息返回给调用方(impalad),然后异步执行元数据和数据的加载。
4.impalad收到catalogd的返回值,返回值是更新之后的表缓存对象+版本号,但是这是一个不完整的表元数据,impalad将这个元数据应用到本地元数据缓存。
5.INVALIDATE METADATA执行完成。
INVALIDATE METADATA操作带来的副作用是生成一个新的未完成的元数据对象,对于操作请求的impalad(称它为impalad-A),能够立马获取到该对象,对于其它的impalad需要通过statestored同步,因此执行完该操作,处理该操作的impalad对于该表的缓存是一个新的但是不完整的对象,其余的impalad保存的是旧的元数据。

对于后续的该表查询操作,分为如下四种情况:

如果catalogd已经完成该表所有元数据加载,会对该表生成一个新的版本号(假设version=2),然后更新到statestored,由statestored广播到各个impalad节点上,此时所有的查询都查询到最新的元数据和数据。
如果catalogd尚未完成表的元数据加载或者statestored未广播完成,并且接下来请求到impalad-A(之前执行INVALIDATE METADATA的节点),此时impalad在执行语义分析的时候能够检测到表的元数据不完整(因为当前只有表名和库名,没有任何其余的元数据),impalad会直接请求catalogd获取该表最新的元数据,如果catalogd尚未完成元数据加载,则该请求会等到直到catalogd加载完成并返回impalad最新的元数据。
如果catalogd尚未完成表的元数据加载或statestored未广播完成,接下来请求到了其他的impalad节点,如果接受请求的impalad尚未通过statestored同步新的不完整的表元数据(version=1),则该impalad中缓存的关于该表的元数据是执行INVALIDATE METADATA之前的,因此根据旧的元数据处理该查询(可能因为文件被删除导致错误)。
如果catalogd尚未完成表的元数据加载,接下来请求到了其他的impalad节点,如果接受请求的impalad已经通过statestored同步新的不完整的表元数据(version=1),那么接下来会像第二种情况一样处理。
从INVALIDATE METADATA的实现来看,该操作不仅仅会全量加载表的元数据和分区、文件元数据,还会影响后面关于该表的查询。

REFRESH原理
对于REFRESH操作,由客户端将查询提交到某个impalad节点上,执行如下的操作:

1.获取需要执行REFRESH的表和分区信息。
2.请求catalogd执行resetMetadata操作,并将isFresh参数设置为true。
3.catalogd接收到该请求之后判断是否指定分区,如果指定了分区则执行reload partition操作,如果未指定则执行reload table操作,对于reloadPartition则从metastore中读取partition最新的元数据,然后刷新该partition拥有的所有文件的元数据(大小,权限,数据分布等);对于reloadTable则从metadata中读取全部的partition信息,然后和缓存中的partition进行比对判断是否有分区需要增加和删除,对于其余的分区则执行元数据的更新。
4.impalad收到catalogd的返回值,返回值是更新之后该表的缓存数据,impalad会将该数据更新到自己的缓存中。因此接受请求的impalad能够将当前元数据缓存。
5.REFRESH执行完成。
对于后续的查询,分为如下两种情况:

如果查询提交到到执行REFRESH的impalad节点,那么查询能够使用最新的元数据。
如果查询提交到其他impalad节点,需要依赖于该表0更新后的缓存是否已经同步到impalad中,如果已经完成了同步则可以使用最新的元数据,如果未完成则使用旧的元数据。
可以看出REFRESH操作较之于INVALIDATE METADATA是轻量级的操作,如果更改只涉及到一个分区设置可以只刷新一个分区的元数据,并且它是同步的,对于之后查询的影响较小。

使用原则
如果在使用过程中涉及到了元数据或者数据的更新,则需要使用这两者中的一个操作完成,具体如何选择需要根据如下原则:

invalidate metadata操作比refresh要重量级
如果涉及到表的schema改变,使用invalidate metadata [table]
如果只是涉及到表的数据改变,使用refresh [table]
如果只是涉及到表的某一个分区数据改变,使用refresh [table] partition [partition]
禁止使用invalidate metadata什么都不加,宁愿重启catalogd。
总结
REFRESH和INVALIDATE METADATA对于impala而言是比较重要的两个操作,分别处理数据和元数据的修改,其中REFRESH操作是同步的,INVALIDATE METADATA是异步的,本文详细介绍了两种语句的适用场景和执行原理,以及可能造成的影响,最重要的是,需要谨记这两种查询使用场景。

参考
INVALIDATE METADATA语句
REFRESH语句
Impala源代码

作者:教练_我要踢球
来源:CSDN
原文:https://blog.csdn.net/yu616568/article/details/72780346
版权声明:本文为博主原创文章,转载请附上博文链接!

【impala】Impala中的invalidate metadata和refresh相关推荐

  1. 正确使用Impala的invalidate metadata与refresh语句

    在Impala中,invalidate metadata与refresh语句都可以用来刷新表,但它们本质上还是不同的.本文简要分析一下,并说明它们应该在什么情况下使用. Impala on Hive介 ...

  2. Impala 中invalidate metadata和refresh

    首先了解一下:Impala如何融入Hadoop生态系统 Impala使用了Hadoop生态系统中许多熟悉的组件.Impala可以作为消费者和生产者与其他Hadoop组件交换数据,因此它可以以灵活的方式 ...

  3. Impala中的invalidate metadata 和refrsh

    Impala中的invalidate metadata 和refrsh Impala是啥子? Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着im ...

  4. Impala invalidate metadata

    参考<开源大数据分析引擎Impala实战> 贾传青 著  清华大学出版社 211页: invalidate metadata: 更新元数据信息.在创建.删除.修改了数据库.表分区后使用本命 ...

  5. Invalidate, Update, Repaint, Refresh的异同

    #Invalidate, Update, Repaint, Refresh的异同 文章目录 Invalidate Update Repaint Refresh Invalidate Invalidat ...

  6. Apache Impala : Impala安装部署

    Impala Impala安装部署 安装前提 下载安装包.依赖包 虚拟机新增磁盘(可选) 关机新增磁盘 开机挂载磁盘 配置本地yum源 上传安装包解压 配置本地yum源信息 安装Impala 集群规划 ...

  7. Python-EEG工具库MNE中文教程(14)-Epoch对象中的元数据(metadata)

    目录 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 本案例演示使用Epochs元数据.关于Epochs数据结构:可以查看文章Python-EEG工具库MN ...

  8. Flutter中基于Dio实现Token Refresh

    Flutter中基于Dio实现Token Refresh 1. 背景介绍 目前项目在采用Flutter开发一款App,该工程中采用Dio框架作为网络请求框架,用户登录方面采用 OAuth2 协议.众所 ...

  9. MFC中的Invalidate、OnDraw、OnPaint函数的作用及绘图概念

    1.绘图概念 GDI绘图分为背景和前景两个画布的绘制,Invalidate()函数强制重绘制, Invalidate()     如果参数为true则在OnPaint函数对背景先进行绘制,再对前景进行 ...

最新文章

  1. mysql 5.6 proxy_mysql-5.6+mysql-proxy构建主从复制与读写分离
  2. Javascript复习题
  3. SpringMVC教程上篇
  4. js 负数移位运算究竟如何进行
  5. Python 语言参考手册
  6. 常用的数据分析方法(聚类、因子、相关、对应、回归、方差)简述【转】
  7. python图片处理大全_python图像处理:怎么给图片加框?
  8. 通信算法之九:4FSK调制解调仿真链路
  9. Linux 系统日常运维九大技能和运维网络知识总结
  10. Unity 接入高德开放API - 天气查询
  11. CNN网络架构学习:Chapter-5-ResNet(附代码tensorflow)
  12. 客房管理android源码,c++ 客房管理系统完整源码(含数据库)
  13. 有没有人帮忙出一份答案,本人急用,python一级试卷。谢谢
  14. 10 数据库与身份认证
  15. 吉尔电子烟获1200万天使轮融资
  16. Vue-视频加载(vue-video-player)支持.mp4.m3u8.flv.mov格式
  17. [信息化]企业信息化规划建设中需要注意的点
  18. 2015计算机职称水平考试,2015计算机职称等级考试技巧汇总.doc
  19. 肖 清华计算机系 北大生命科学,清华大学生命学院、电子系和计算机系合作提出新型的冷冻电镜三维重构算法...
  20. 中国股市是否出现非理性繁荣?(转载)

热门文章

  1. 揭秘了!小米透明电视所用处理器为联发科定制
  2. 不到2公里要价5400元,货拉拉还能拉多久?
  3. 二代征信系统上线 这些内容与你有关
  4. 共享充电宝“脱贫”:打脸王思聪 眼红了“负翁”ofo
  5. 苹果A13打得过麒麟990吗?看完秒懂
  6. 全国首个!北京手机一卡通开卡费今起取消
  7. 刘作虎曝光一加7真机视频 最流畅的手机来了!
  8. 国家广电总局:立即停播“椰树牌椰汁”等部分版本广告
  9. Facebook合并WhatsApp和Instagram?德国:展开反垄断调查!
  10. 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?