Impala基础知识、使用、优化

Impala简介

Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大卖点就是它的快速。

优点

  • Impala不需要把中间结果写入磁盘,省去了大量的io开销
  • 省掉了mr作业启动的开销,mr启动task的速度很慢,impala直接通过响应的服务进程来进行作业调度,速度快了很多。
  • Impala完全抛弃了mr这个不太适合做sql查询的范式,而是想dremel一样借鉴了mpp并行数据库的思想另起炉灶,因此可以更多的查询优化,从而节省掉不必要的shuffle、sort等开销
  • 用c++实现,做了很多针对性的硬件优化,例如使用sse指令
  • 使用了支持data locality的io调度机制,尽可能的将数据和计算分配在同一台机器上进行,减少了网络开销。
  • Hive 基于MapReduce,而启动MapReduce就需要启动jvm,用完了在释放资源,而打开jvm也很耗时间,第二,MapReduce 的运算有分多个步骤,有map阶段,有reduce阶段。有shuffle阶段。每个步骤都会涉及到网络的数据传输,同时每个步骤都会涉及到数据落入磁盘。相当于会增加一个系统的io。我们优化主要就是优化 io读写,网络带宽,尽量减少传输数据。
  • Impala独特地方:数据可以本地执行 ,如果impala访问一个很小的表,那么就没有必要去各个节点去做分布式的查询,只需要在一个几点上做。 这就是impala data locality,这样就尽量减少网络传输【这个功能需要开启】

功能

  • Impala可以根据Apache许可证作为开源免费提供。
  • Impala支持内存中数据处理,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动。 [2]
  • 使用类SQL查询访问数据。
  • Impala为HDFS中的数据提供了更快的访问。
  • 可以将数据存储在Impala存储系统中,如Apache HBase和Amazon s3。
  • Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。

差异

Impala使用类似于SQL和HiveQL的Query语言。 下表描述了SQL和Impala查询语言之间的一些关键差异

Impala 关系型数据库
Impala使用类似于HiveQL的类似SQL的查询语言。 关系数据库使用SQL语言。
在Impala中,您无法更新或删除单个记录。 在关系数据库中,可以更新或删除单个记录。
Impala不支持事务。 关系数据库支持事务。
Impala不支持索引。 关系数据库支持索引。
Impala存储和管理大量数据(PB)。 与Impala相比,关系数据库处理的数据量较少(TB)。

Hive,Hbase和Impala

虽然Cloudera Impala使用与Hive相同的查询语言,元数据和用户界面,但在某些方面它与Hive和HBase不同。 下表介绍了HBase,Hive和Impala之间的比较分析。

HBase Hive Impala
HBase是基于Apache Hadoop的宽列存储数据库。 它使用BigTable的概念。 Hive是一个数据仓库软件。 使用它,我们可以访问和管理基于Hadoop的大型分布式数据集。 Impala是一个管理,分析存储在Hadoop上的数据的工具。
HBase的数据模型是宽列存储。 Hive遵循关系模型。 Impala遵循关系模型。
HBase是使用Java语言开发的。 Hive是使用Java语言开发的。 Impala是使用C ++开发的。
HBase的数据模型是无模式的。 Hive的数据模型是基于模式的。 Impala的数据模型是基于模式的。
HBase提供Java,RESTful和Thrift API。 Hive提供JDBC,ODBC,Thrift API。 Impala提供JDBC和ODBC API。
支持C,C#,C ++,Groovy,Java PHP,Python和Scala等编程语言。 支持C ++,Java,PHP和Python等编程语言。 Impala支持所有支持JDBC / ODBC的语言。
HBase提供对触发器的支持。 Hive不提供任何触发器支持。 Impala不提供对触发器的任何支持。

Impala服务组件

  1. Impala Deamon
    该进程运行于集群每个节点的守护进程,是Impala的核心组件,每个节点该进程的名称为 impalad 。

    ps -ef|grep impalad 
    

    负责读取数据文件;接受来自impala-shell、Hue / JDBC/ODBC的查询请求,与其他节点并行分布式工作,
    并将本节点的查询结果返回给中心协调者节点(建议使用JDBC/ODBC接口以round-robin的方式将每个查询提交的不同节点 impalad上)。

  2. Impala Statestore
    Statestore 搜集集群中 impalad 进程节点的健康状况,并不断的将健康状况结果转发给所有的 impalad 进程节点.

    ps -ef|grep statestored 
    

    一个 impala 集群只需要一个 statestore 进程节点。 Statestore的目的:在集群故障时对 impalad进程节点同步信息

  3. Impala Catalog
    当 Impalad 集群中执行SQL 语句会引起元数据变化时,catalog服务负责将这些变化推送到其他 impalad进程节点上,汇报工作。
    Impala基础知识、使用、优化_第1张图片

资源管理以及优化

如果资源管理的得当,那么使用起来没有任何问题,如果优化不得当,那么使用起来处处是坑

Impala资源管理

  • 静态资源池

    • 主要通过clouderamanger进行设置
    • 使用静态服务池可以给impala和其他服务分配专用的资源,以考虑到预计的资源需求
    • 静态服务吃将夫妻彼此隔离开,因为这个高负载的服务对其他服务的影响是有限的,你可以使用cm来配置静态服务池,控制内存,CPU和磁盘的io

    资源管理的相关参数
    Impala yarn hdfs 合起来 100%
    Impala基础知识、使用、优化_第2张图片
    根据自己业务的需求来分配资源。

  • 动态资源池

    • 动态资源池是用来配置及用于在池中运行的yarn应用程序或impala查询之间安排的资源策略,动态资源池允许你基于用户访问指定池的权限。调度和分配资源给impala查询使用。
  • 资源管理的相关参数

    • Request_pool:通过这个参数可以将查询语句体较大不同的资源池
      如:set request_pool=impala
      针对于应用来说,比如我A类应用我允许他访问impala资源池,B类应用我允许他访问default资源池,可以做到访问隔离
    • Men_limit 可以解决impala对复杂查询的内存消耗,估算不准确的问题,
      如:set mem_limit=10kb
      性能调优中使用。Session 级别设置,不是系统化参数,我一个sql需要100m,但是men_limit只有50m,这个时候就会失败。
    • Explant_level :执行计划的详细程度。
      如:set explant_level=3
      1 【基本】
      2 【更加明晰】
      3 【更加详细】
    • Compute stats 收集统计信息
      如: compute stats default.dual
      compute invremental stats default.dual
      show table stats default.dual
      show column stats default.dual
  • 收集统计信息
    【作用】在关系型数据库,一个sql使用执行计划,实际上是没有执行sql的,但是为什么会有执行计划出来,他访问的是后台的元数据的统计信息,依赖与统计信息才生成执行计划,如果你的统计信息不准,那么执行计划就不准。,所以可以打出执行计划,在impala中也是如此,compute stats 的作用就是收集执行计划

  • INVALIDATE METADATA
    使用hive 跟impala是用工元数据的,放我们在hive中创建了一张表,那么我们可以通过invalidate metadata 这个命令来同步hive中的元数据

  • REFRESH
    在表存在的情况下,如果向表里添加数据,使用refresh可以将元数据重新统计一遍

  • broadcast join
    广播连接中impala将较小的表通过网络分发到所有需要执行该连接的impala后台进程,分发完成后,参与连接的impala进程会根据数据建立哈希表并保存在内存中,然后每个impala后台进程读取大表在本节点中的数据并使用内存中的哈希表查询找到匹配的记录
    【大表和小表 join的时候,建议用broadcast join,这样可以把小表广播到impalad的各个节点】

  • Partitioned join
    分区哈希连接需要更多的网络开销,但可以允许大表的连接而不要求整个表的数据都能做到一个节点的内存中,当统计数据显示表太大而无法放到一个节点的内存中或者有查询提示时就会使用分区哈希连接,进行分区哈希连接是(也称为shuffle join),每个impala进程读取两个表的本地数据,使用一个哈希数进行分区并把每个跟去分发到不同的impala进程。

强制使用 broadcast 或者 shuffle join
Select * from test join /* +broadcast */test2 on test.a=test2.a
Select * from test join /* +shuffle */ test2 on test.a=test2.a
注意 broadcast一定要在小表前

下面是一个根据执行计划优化的案例
1.场景:使用impala查询hbase数据。数据不多600W左右
Impala基础知识、使用、优化_第3张图片
2.我们使用explain查看以下执行计划。
Impala基础知识、使用、优化_第4张图片
3.查看以下表的状态
Impala基础知识、使用、优化_第5张图片
4.看一下列的状态,-1为未知状态
Impala基础知识、使用、优化_第6张图片

5.执行看看这条语句需要花费多长时间
Impala基础知识、使用、优化_第7张图片

6.我们进行优化,收集以下这个表的统计信息
Impala基础知识、使用、优化_第8张图片
7.再次看一下执行计划
Impala基础知识、使用、优化_第9张图片
8.再次查看表状态
Impala基础知识、使用、优化_第10张图片
9.再次查看列状态,跟上次相比,这次的系信息要比上次全面一点
Impala基础知识、使用、优化_第11张图片
10.我们再次性执行同样那个sql
Impala基础知识、使用、优化_第12张图片
对比一下第一次和第二次的时间差,第一次【89.34s】,第二次【56.70s】,
当然我这里面没有公布集群的资源信息,其实集群信息在这次对比试验中已经不那么重要了,因为在相同条件下,两条语句在收集执行计划前、后的对比已经很明显了,如果对集群的资源加以利用,合理分配,那么优化效果会更加明显。

impala常用命令

1.查看数据库:
show databases;

2.查看执行计划-explain命令返回给定查询的执行计划。
explain select * from dual;

3.查看历史命令
history

4.创建数据库
CREATE DATABASE IF NOT EXISTS gpf;

5.使用级联,您可以直接删除此数据库(无需手动删除其内容)
DROP database sample cascade;

6.选择数据库
use db_name;

7.查看表结构
DESC test_info;

8.连接
connect CDH3 or impala-shell -i cdh3;

9.建表
CREATE EXTERNAL TABLE gpf.temp_gpf(
id string,
name string)

10.数据类型转换
CAST()
CAST (expression AS data_type)
可以使用 CAST() 函数,转换 STRING 为 TINYINT, SMALLINT, INT, BIGINT, FLOAT, DOUBLE, TIMESTAMP

11 执行计划
explain select * from temp_gpf;
compute stats table

12.show
show table stats temp_gpf;
show column stats temp_gpf;
compute stats temp_gpf;

13.查询tt表的建表语句
show create table tt

14.like 区分大小写
不区分大小写的ILIKE,区分大小写LIKE ‘*%

15.between
between 1 and 10,范围区间是>=1 and <=10

16.将内部表更改为外部表
ALTER TABLE test SET TBLPROPERTIES(‘EXTERNAL’=’TRUE’);

impala查询hbase【hbase-impala】

  • hbase创建表
    create ‘temp_user_gpf’, {NAME => ‘data’, VERSIONS => 3}

    put ‘temp_user_gpf’, ‘0001’, ‘data:name’, ‘GPF’
    put ‘temp_user_gpf’, ‘0001’, ‘data:age’ , ‘18’
    put ‘temp_user_gpf’, ‘0002’, ‘data:name’, ‘YXC’
    put ‘temp_user_gpf’, ‘0002’, ‘data:age’ , ‘19’
    put ‘temp_user_gpf’, ‘0003’, ‘data:name’, ‘SYC’
    put ‘temp_user_gpf’, ‘0003’, ‘data:age’ , ‘20’
    put ‘temp_user_gpf’, ‘0004’, ‘data:name’, ‘CJC’
    put ‘temp_user_gpf’, ‘0004’, ‘data:age’ , ‘21’

  • 新增数据
    put ‘temp_user_gpf’, ‘0005’, ‘data:name’, ‘CS’
    put ‘temp_user_gpf’, ‘0005’, ‘data:age’ , ‘22’

    put ‘temp_user_gpf’, ‘0006’, ‘data:name’, ‘XDF’
    put ‘temp_user_gpf’, ‘0006’, ‘data:age’ , ‘23’

  • hive创建表

    CREATE EXTERNAL TABLE temp_user_gpf(
    id string,
    name string,
    age string)
    ROW FORMAT SERDE ‘org.apache.hadoop.hive.hbase.HBaseSerDe’
    STORED BY ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
    WITH SERDEPROPERTIES (“hbase.columns.mapping” = “:key, data:name, data:age”)
    TBLPROPERTIES(“hbase.table.name” = “temp_user_gpf”);

表大小
show table stats test;

修改备注
alter table device CHANGE COLUMN key key int comment ‘key’;

以上为总结,随时更新,不足之处还望不吝赐教

你可能感兴趣的:(impala)