一、相关资料

CDH文档 https://docs.cloudera.com/documentation/enterprise/latest/topics/impala.html

官方文档 http://impala.apache.org/downloads.html

Impala3.4对接Iceberg在网易的最新实践

Impala3.4在网易大数据的优化和实践

网易基于Impala平台打造交互查询系统

基于kudu和KRPC实现 Impala 的飞跃

爱奇艺海量数据实时分析架构的演进

二、定位及使用

Impala是Cloudera公司主导开发的交互式查询系统,它提供SQL语义和计算能力,但是本身并不存储数据。

1. 什么是Impala?

  • Cloudera开源贡献至Apache的OLAP引擎
  • 提供高并发和低延迟的交互式SQL查询
  • 可以查询HDFS/HBase/Kudu中的数据

2. Impala优势

  • 去中心化的MPP架构
  • 完全兼容Hive元数据格式
  • Apache顶级项目,社区活跃度高
  • 支持多种数据格式,例如Parquet、Orc、Avro等
  • 高效的查询性能,支持codegen、llvm、runtime filter等

3. Impala架构简介

下面是Impala的一个架构,如图所示: tw1

Impalad节点分为两种角色:

  • Coordinator(协调者):响应客户端请求,SQL解析
  • Executor(执行者):数据扫描、聚合运算

Impalad内部分为两个模块:

  • Frontend:执行SQL解析,Java代码编写
  • Backend:进行聚合运算,C++代码编写

Impala主要分为三种服务,每种服务对应一个单独的进程。

  • 第一种服务:从最左边绿色的部分可以看起,它是一个Impalad 进程,主要有两种角色,第一种角色:Coordinator(协调者),它主要的功能是响应JDBC请求,对发过来的SQL进行执行计划解析,将SQL生成的执行计划发给各个Executor(执行者),这些Executor会进行数据扫描和聚合运算等操作。每个Impalad节点,既可以充当Coordinator,也可以充当Executor,也可以二者兼之。在Impalad内部也分为两个模块,其中FE模块由Java代码编写,主要执行SQL的解析操作,使用Java可以更好地兼容Hadoop生态圈;BE模块由C++代码编写,主要负责实际的数据扫描、聚合运算,使用C++可以进行更好地性能优化。

  • 第二种服务:catalogd,它是一个元数据服务,单独的一个进程,主要就是将hive的metastore所存储的元数据缓存到自己的内存当中。

  • 第三种服务:statestored,它是一个发布订阅服务,主要的作用包括节点之间状态信息的同步、元数据信息的同步、资源队列的信息同步等等。

这里以元数据服务加载为例:首先catalogd将元数据缓存到自己的内存中,同时它会将元数据信息发布到statestored上面,然后Impalad就可以去订阅相应的topic,将这部分信息拉到自己的本地进行缓存。这整体就是一个发布订阅的过程。

需要注意的是,在一个Impala集群中,statestored和catalogd只有一个,Impalad节点有若干个。由于coordinator需要进行执行计划解析,因此需要缓存元数据在自己的内存中。实际线上部署的时候,我们一般会将coordinator和executor分开,同时集群中只有配置少量几个coordinator节点,大部分都是executor节点。

4. Impala 3.x新特性

3.0到3.4的特性罗列:

  • 支持在相同的查询块中存在多个distinct算子
  • 支持优雅的(不影响正在执行的查询)关闭impala进程
  • 支持ORC文件格式
  • 支持DATE数据类型及其操作函数
  • 支持将远端的HDFS/S3等文件缓存到Impalad节点上
  • CBO增强
  • 支持将Profile信息导出成JSON格式,方便解析

5. 应用场景

  1. 交互式查询分析系统,对下可以查询存储在HDFS、Kudu、HBase等等这些存储系统中的数据,向上它可以对接一些我们开发的BI工具、或者是一些业务自己的系统等。
  2. 自助分析,主要提供给分析师或者数据开发人员使用,直接在页面上提交SQL查询,通过SQL来获取自己想要的数据,这个与Cloudera的HUE类似
  3. 作为BI工具后端数据存储引擎,BI系统会自动地生成相应的SQL,发到Impala,根据Impala的查询结果,以图形化的界面形式展示给用户