Impala--交互式查询工具

05 Feb 2021

概述

是什么

Impala是Cloudera提供的一款开源的针对HDFS和HBASE中的PB级别数据进行交互式实时查询(Impala 速度快),Impala是参照谷歌的新三篇论⽂文当中的Dremel实现而来,其中旧三篇论文分别是 (BigTable,GFS,MapReduce)分别对应HBase和已经学过的HDFS以及MapReduce。
Impala最大卖点和最大特点就是快速

官网:https://impala.apache.org

Impala的诞⽣

Hive以及MR适合离线批处理,但是对交互式查询的场景无能为力(要求快速响应),为了解决查询速度的问题,Cloudera公司依据Google的Dremel开发了Impala,Impala抛弃了MapReduce 使⽤了类似于传统的MPP数据库技术,⼤大提⾼了查询的速度。

MPP是什么?

MPP (Massively Parallel Processing),就是大规模并行处理,在MPP集群中,每个节点资源都是独⽴ 享有也就是有独⽴的磁盘和内存,每个节点通过网络互相连接,彼此协同计算,作为整体提供数据服务。

简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的 结果汇总在一起得到最终的结果

对于MPP架构的软件来说聚合操作比如计算某张表的总条数,则先进行局部聚合(每个节点并行计算), 然后把局部汇总结果进⾏全局聚合(与Hadoop相似)。

Impala与Hive对比

Impala 安装

1. 集群准备

2. 准备Impala的所有依赖包

impala只提供了rpm安装包,而安装的过程有需要索引很多依赖包,所以这里直接从Cloudera官网下载cdh所有软件包,并制作本地yum源,然后会采用yum的方式安装,可以免去手动添加以来的烦恼

3. 安装Impala

Impala⼊门案例

使用Yum⽅式安装Impala后,impala-shell可以全局使用; 进入impala-shell命令行

impala的交互窗⼝

示例代码

sql代码和hive保持一致,但是不能使用dfs指令

show databases;  
  
#表如果存在则删除  
drop table if exists t1;  
  
#创建外部表  
create external table t1(  
        id string,  
        name string,  
        age int,  
        gender int)  
row format delimited   
fields terminated by ','  
location '/user/impala/t1';  
  
#创建内部表  
create table t2(  
        id string,  
        name string,  
        age int,  
        gender int)  
row format delimited   
fields terminated by ',';  
  
# 导入数据到内部表  
insert overwrite table t2 select * from t1 where gender=0;  
  
# impala无法感知hive元数据更新,使用下面的命令强制更新  
invalidate metadata;  

小结

  1. 上面案例中Impala的数据文件我们准备的是以逗号分隔的⽂本文件,实际上,Impala可以⽀
    持RCFile,SequenceFile,Parquet等多种文件格式。
  2. Impala与Hive元数据的关系?

    Hive对于元数据的更新操作不能被Impala感知到; Impala对元数据的更新操作可以被Hive感知到。
    Impala同步Hive元数据命令:
    手动执行invalidate metadata

  3. Impala操作HDFS使用的是Impala用户,所以为了避免权限问题,我们可以选择关闭权限校验
    在hdfs-site.xml中添加如下配置:
 <!--关闭hdfs权限校验 --> <property>  
  <name>dfs.permissions.enabled</name>  
        <value>false</value>  
</property>  

Imapla的架构原理

Impala的组件

Impala是一个分布式,大规模并行处理(MPP)数据库引擎,它包括多个进程。Impala与Hive类似不是数据库而是数据分析⼯具;

Impala的查询

1. Client提交任务

Client发送一个SQL查询请求到任意一个Impalad节点,会返回一个queryId用于之后的客户端操作。

2. 生成单机和分布式执行计划

SQL提交到Impalad节点之后,Analyser依次执⾏SQL的词法分析、语法分析、语义分析等操作; 从MySQL元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关 数据的所有数据节点

3. 任务调度和分发

Coordinator将Fragment(子任务)根据数据分区信息发配到不同的Impalad节点上执行。Impalad 节点接收到执行Fragment请求交由Executor执行。

4. Fragment之间的数据依赖

每一个Fragment的执行输出通过DataStreamSink发送到下一个Fragment,Fragment运行过程中
不断向coordinator节点汇报当前运⾏状态。

5. 结果汇总

查询的SQL通常情况下需要有⼀个单独的Fragment用于结果的汇总,它只在Coordinator节点运行,将多个节点的最终执⾏结果汇总,转换成ResultSet信息。

6. 获取结果

客户端调用获取ResultSet的接⼝,读取查询结果。

Impala的使用

Impala的核心开发语⾔是sql语句,Impala有shell命令⾏窗口,以及JDBC等⽅式来接收sql语句执行, 对于复杂类型分析可以使⽤C++或者Java来编写UDF函数。
Impala的sql语法是高度集成了Apache Hive的sql语法,Impala支持Hive支持的数据类型以及部分Hive 的内置函数。

Impala-shell

Impala sql语法

SQL基本上和hive一致,这里只写出不同点

Impala导⼊数据

Impala的JDBC方式查询

Impala进阶

Impala的负载均衡

Impala主要有三个组件,分别是statestore,catalog和impalad,对于Impalad节点,每一个节点都可以接收客户端的查询请求,并且对于连接到该Impalad的查询还要作为Coordinator节点(需要消耗⼀定的内存和CPU)存在,为了保证每一个节点的资源开销的平衡需要对于集群中的Impalad节点做一下 负载均衡.

Impala优化