前言
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] //重新加载指定的某个表
REFRESH是用于刷新某个表或者某个分区的数据信息,它会重用之前的表元数据,仅仅执行文件刷新操作,它能够检测到表中分区的增加和减少,主要用于表中元数据未修改,数据的修改,例如INSERT INTO、LOAD DATA、ALTER TABLE ADD PARTITION、LLTER TABLE DROP PARTITION等,如果直接修改表的HDFS文件(增加、删除或者重命名)也需要指定REFRESH刷新数据信息。
REFRESH 语法:
REFRESH [table] //刷新某个表
REFRESH [table] PARTITION [partition] //刷新某个表的某个分区
INVALIDATE METADATA原理
对于INVALIDATE METADATA操作,由客户端将查询提交到某个impalad节点上,执行如下的操作:
- 获取需要执行INVALIDATE METADATA的表,如果没指定表则不设置表示全部表(不考虑这种情况)。
- 请求catalogd执行resetMetadata操作,并将isFresh参数设置为false。
- catalogd接收到该请求之后执行invalidateTable操作,将该表的缓存清除,然后重新生成该表的缓存对象,新生成的对象只包含表名+库名的信息,为新生成的表对象生成一个新的catalog版本号(假设新的version=1),将这部分信息返回给调用方(impalad),然后异步执行元数据和数据的加载。
- impalad收到catalogd的返回值,返回值是更新之后的表缓存对象+版本号,但是这是一个不完整的表元数据,impalad将这个元数据应用到本地元数据缓存。
- 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节点上,执行如下的操作:
- 获取需要执行REFRESH的表和分区信息。
- 请求catalogd执行resetMetadata操作,并将isFresh参数设置为true。
- catalogd接收到该请求之后判断是否指定分区,如果指定了分区则执行reload partition操作,如果未指定则执行reload table操作,对于reloadPartition则从metastore中读取partition最新的元数据,然后刷新该partition拥有的所有文件的元数据(大小,权限,数据分布等);对于reloadTable则从metadata中读取全部的partition信息,然后和缓存中的partition进行比对判断是否有分区需要增加和删除,对于其余的分区则执行元数据的更新。
- impalad收到catalogd的返回值,返回值是更新之后该表的缓存数据,impalad会将该数据更新到自己的缓存中。因此接受请求的impalad能够将当前元数据缓存。
- 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是异步的,本文详细介绍了两种语句的适用场景和执行原理,以及可能造成的影响,最重要的是,需要谨记这两种查询使用场景。
原文:https://blog.csdn.net/yu616568/article/details/72780346
相关推荐
本文将提供三种改造方案来解决Impala并发查询缓慢问题,并对每种方案进行测试验证和比较。 解决方案一:将 TIMESTAMP 改为 STRING 类型 在Impala并发查询缓慢问题中,TIMESTAMP 字段类型是导致性能下降的主要原因...
然而,当涉及到处理中文字符时,Impala的内置函数`substr()`和`substring()`可能会遇到一些挑战,尤其是在截取中文字符串时可能出现乱码问题。这是因为这两个函数在设计时可能没有充分考虑多字节字符集,如UTF-8,而...
本文通过亿级数据量在Hive和Impala中对比了text、orc和parquet这三种不同的文件格式,以分析它们的性能表现。 首先,让我们深入了解每种文件格式的特点: 1. **Parquet**: - 优点:Parquet采用了高效的压缩和...
本文主要探讨了在Hive和Impala中使用TextFile、ORC和Parquet三种不同数据格式的性能表现。Hadoop、Hive和Impala是大数据处理中的核心组件,而ORCFile和ParquetFile则是优化数据存储的常用格式。 首先,TextFile是最...
在版本3.4中,升级指南可能详细说明了升级到Impala 3.0时需要的特别操作,例如给拥有SELECT或INSERT权限的Impala角色授予REFRESH权限。同时,文档还可能列出了Impala 3.0中更新的保留字、Decimal数据类型的默认版本...
- **INVALIDATE METADATA**:刷新元数据缓存,以确保Impala使用最新的表定义。 - **REFRESH TABLE**:更新特定表的元数据,使其与底层数据保持一致。 #### 2.2 DML操作 - **LOAD DATA**:用于加载数据到HDFS中,并...
值得注意的是,Impala 3.0版本带来了许多变更,包括启用插入时的聚类提示、移除了过时的查询选项、增加了细粒度的权限、移除了Impala shell中的refresh_after_connect选项、修改了保留字列表、将Decimal V2设为...
在本文中,我们将深入探讨如何在SpringBoot应用中集成Impala数据仓库系统,以及涉及到的相关配置和步骤。首先,我们来看看关键的组成部分: 1. **SpringBoot集成**: SpringBoot是基于Spring框架的一个轻量级开发...
- **元数据刷新**: 当通过Impala执行CREATE TABLE、INSERT等操作时,不需要显式执行REFRESH或INVALIDATE METADATA语句。但如果类似的元数据更改操作通过Hive完成,还是需要执行这些语句,不过只需要在一个节点上执行...
Impala是Cloudera公司开发的一款开源的大规模并行处理(MPP)查询引擎,它为存储在Hadoop中的数据提供实时查询服务。与传统的MapReduce计算模型相比,Impala能够提供更快的数据访问速度,因为它采用了与传统关系...
在 Impala 中,物理和 Schema 设计是非常重要的。物理设计决定了数据的存储方式,而 Schema 设计决定了数据的逻辑结构。 字段类型 在 Impala 中,字段类型的选择非常重要。数值类型比 String 类型更高效,因为 ...
标题 "dbeaver impala jdbc连接包" 涉及到的是在数据管理工具DBeaver中连接Impala数据库所必需的Java Database ...正确配置和使用这个驱动,可以方便地在DBeaver中执行SQL查询、管理Impala数据和进行数据分析。
4. Impala Catalog Service 负责管理元数据和数据 schema 5. Impala Daemon 执行查询语句,并将结果返回给客户端 Impala 的主要组件 Impala 的主要组件包括: * Impala Daemon:负责执行查询语句和管理资源 * ...
在本压缩包"impala数据库JDBC驱动集"中,我们很显然会找到用于连接和操作Impala数据库的JDBC驱动程序。 Impala的主要特点包括其并行查询执行模型,它能够快速地处理PB级别的数据,而无需将数据从HDFS或HBase中提取...
In addition to using the same unified storage platform, Impala also uses thesame metadata, SQL syntax (Hive SQL), ODBC driver, and user interface (Impala query UI in Hue) as Apache Hive.This provides...
在本文档中,我们将详细介绍 Impala 的安装过程,包括 MASTER 节点和 WORKER 节点的安装配置。 Impala 安装 在开始安装 Impala 之前,需要确保已经安装了 Hadoop 环境。 Impala 安装推荐使用 yum 安装,具体的安装...
Impala 的主要特点是高性能、实时查询和灵活的查询语言。Impala 能够与 Hadoop 生态系统集成,支持各种数据源,如 HDFS、HBase、Kafka 等。 2. Impala 的特点 Impala 具有以下几个特点: * 高性能:Impala 能够...
Impala 3.0中的教程部分提供了关于如何使用Impala进行数据查询和管理的示例,这些教程帮助用户熟悉Impala的各种功能和操作,包括如何在Impala中使用DML语句进行数据操作。 总体而言,Impala3.0参考文档为用户提供了...
4. **其他依赖库**: 压缩包中的其他文件如hive_metastore.jar、TCLIServiceClient.jar等,是Impala和Hive相关的库,它们用于与Hadoop生态系统中的组件进行通信,例如元数据管理和协调服务。 以下是使用Java通过JDBC...
标题中的“Impala的JDBC编程驱动”指的是Impala(一个开源的、高性能的SQL查询引擎,用于处理存储在Hadoop集群中的数据)与Java应用程序之间的桥梁,即JDBC(Java Database Connectivity)驱动。JDBC驱动是Java...