背景

impala是cloudera提供的一款高效率的sql查询工具,提供实时的查询效果,官方测试性能比hive快10到100倍,其sql查询比sparkSQL还要更加快速,号称是当前大数据领域最快的查询sql工具。impala是参照谷歌的新三篇论文(Caffeine—网络搜索引擎、Pregel—分布式图计算、Dremel—交互式分析工具)当中的Dremel实现而来,其中旧三篇论文分别是(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
Kudu与Apache Impala (孵化)紧密集成,impala天然就支持兼容kudu,允许开发人员使用Impala的SQL语法从Kudu的tablets 插入,查询,更新和删除数据;

impala和hive关系

impala是基于hive的大数据分析查询引擎,直接使用hive的元数据库metadata,意味着impala元数据都存储在hive的metastore当中,并且impala兼容hive的绝大多数sql语法。所以需要安装impala的话,必须先安装hive,保证hive安装成功,并且还需要启动hive的metastore服务。
Hive元数据包含用Hive创建的database、table等元信息。元数据存储在关系型数据库中,如Derby、MySQL等。
客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。

区别:

Impala跟Hive最大的优化区别在于:没有使用 MapReduce进行并行计算,虽然MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行。与 MapReduce相比,Impala把整个查询分成一执行计划树,而不是一连串的MapReduce任务,在分发执行计划后,Impala使用拉式获取数据的方式获取结果,把结果数据组成按执行树流式传递汇集,减少的了把中间结果写入磁盘的步骤,再从磁盘读取数据的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce启动时间。

优化技术:

  • 使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。(C++特性)
  • 充分利用可用的硬件指令(SSE4.2)。
  • 更好的IO调度,Impala知道数据块所在的磁盘位置能够更好的利用多磁盘的优势,同时Impala支持直接数据块读取和本地代码计算checksum。
  • 通过选择合适数据存储格式可以得到最好性能(Impala支持多种存储格式)。
  • 最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。

    执行计划:

    hive 依赖Map->shuffle>Reduce->Map->shuffle->Reduce,会将中间结果写到磁盘
    impala: 提交任务后会形成一个计划树,然后分配到各个impalad中执行。已达到更好的并发并且避免了中间结果的sort和shuffle.

    内存使用:

    HIVE:如果内存放不下则写磁盘
    Impala:如果内存放不下直接执行失败。因此项目中我们一般impala结合hive使用

    优缺点

    优点:

  • 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。 无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。

  • 使用了支持Data locality(数据本地化)的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
  • 支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。
  • 可以访问hive的metastore,对hive数据直接做数据分析。

image.png

缺点

  • 对内存的依赖大,且完全依赖于hive。 实践中,分区超过1万,性能严重下降。
  • 只能读取文本文件,而不能直接读取自定义二进制文件。
  • 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。

    架构

    Impala是一款实时交互SQL大数据查询工具(实时SQL查询引擎Impala),通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query ExecEngine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。
    image.png
    Impala主要由Impalad、 State Store、Catalogd和CLI组成。

    Impalad:

    称为Impala Daemon,是在每个节点上运⾏的进程,是Impala的核⼼组件,进程名是Impalad;  负责读写数据⽂件,接收来⾃Impala-shell,JDBC,ODBC等的查询请求,与集群其它Impalad分布式并⾏完成查询任务,并将查询结果返回给中⼼协调者。

  • 为了保证Impalad进程了解其它Impalad的健康状况,Impalad进程会⼀直与statestore保持通信。

  • Impalad服务由三个模块组成:Query Planner、Query Coordinator和Query Executor,前两个模块组成前端,负责接收SQL查询请求,解析SQL并转换成执⾏计划,交由后端执⾏。

    Impala State Store

  • Impala State Store statestore监控集群中Impalad的健康状况,并将集群健康信息同步给Impalad。

  • statestore进程名为statestored。
  • catalogd
  • Impala执⾏的SQL语句引发元数据发⽣变化时,catalog服务负责把这些元数据的变化同步给其它Impalad进程(⽇志验证,监控statestore进程⽇志)
  • catalogd会在Impala集群启动的时候加载hive元数据信息到Impala,其他时候不会主动加载,需要使用invalidate metadata,refresh命令。
  • catalog服务对应进程名称是catalogd
  • 由于⼀个集群需要⼀个catalogd以及⼀个statestored进程,⽽且catalogd进程所有请求都是经过statestored进程发送,所以官⽅建议让statestored进程与catalogd进程安排同个节点。

    CLI

    提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口

    impala查询流程

  1. 客户端通过ODBC、JDBC、或者Impala shell向Impala集群中的任意节点发送SQL语句,这个节点的impalad实例作为这个查询的协调器(coordinator)
  2. Impala解析和分析这个查询语句来决定集群中的哪个impalad实例来执行某个任务,HDFS和HBase给本地的impalad实例提供数据访问
  3. 各个impalad向协调器impalad返回数据,然后由协调器impalad向client发送结果集

    常用

    ``` 访问impalad的管理界面http://node2.itcast.cn:25000/ 访问statestored的管理界面http://node2.itcast.cn:25010/ 访问catalogd 的管理界面http://node2.itcast.cn:25020/ impala-shell –h可以帮助我们查看帮助手册。也可以参考课程附件资料 impala-shell –f 文件路径 执行指的的sql查询文件。 impala-shell –i 指定连接运行 impalad 守护进程的主机。默认端口是 21000。你可以连接到集群中运行 impalad 的任意主机。 impala-shell –o 保存执行结果到文件当中去。 connect hostname 连接到指定的机器impalad上去执行 refresh dbname.tablename增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况 invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新。 quit/exit命令 从Impala shell中弹出 explain 命令 用于查看sql语句的执行计划。

create table employee (Id INT, name STRING, age INT,address STRING, salary BIGINT); insert into employee VALUES (1, ‘Ramesh’, 32, ‘Ahmedabad’, 20000 ); insert into employee values (2, ‘Khilan’, 25, ‘Delhi’, 15000 ); Insert into employee values (3, ‘kaushik’, 23, ‘Kota’, 30000 ); Insert into employee values (4, ‘Chaitali’, 25, ‘Mumbai’, 35000 ); Insert into employee values (5, ‘Hardik’, 27, ‘Bhopal’, 40000 ); Insert into employee values (6, ‘Komal’, 22, ‘MP’, 32000 );

  1. impala操作kudu
  2. ```sql
  3. --使用impala创建内部表: 在 CREATE TABLE 语句中,必须首先列出构成主键的列。
  4. CREATE TABLE `my_first_table`
  5. (
  6. id BIGINT,
  7. name STRING,
  8. PRIMARY KEY(id)
  9. )
  10. PARTITION BY HASH PARTITIONS 16
  11. STORED AS KUDU
  12. TBLPROPERTIES (
  13. 'kudu.num_tablet_replicas' = '1'
  14. );