Impala 是参照google 的新三篇论文Dremel(大批量数据查询工具)的开源实现,功能相似shark(依赖于hive)和Drill(apache),impala 是clouder 公司主导开发并开源,基于hive 并使用内存进行计算,兼顾数据仓库,具备实时,批处理,多并发等优势。是使用cdh 的首选PB 级大数据实时查询分析引擎。(Impala 依赖cdh 是彻底没有问题的,官网说能够单独运行,可是他单独运行会出现好多的问题)html
参考:node
http://www.cloudera.com/products/apache-hadoop/impala.html程序员
http://www.impala.io/index.html算法
Impala与Shark、sparkSQL、Drill等的简单比较
sql
- Impala起步较早,目前可以商用的为数很少的大数据查询引擎之一;
- CDH5不支持sparkSQL;
- Drill起步晚,尚不成熟;
- shark功能和架构上同Impala类似,该项目已经中止开发。
Impala特色shell
- 基于内存进行计算,可以对PB级数据进行交互式实时查询/分析;
- 无需转换为MR,直接读取HDFS数据
- C++编写,LLVM统一编译运行
- 兼容HiveSQL
- 具备数据仓库的特性,可对hive数据直接作数据分析
- 支持Data Local
- 支持列式存储
- 支持JDBC/ODBC远程访问
- 支持sql92标准,并具备本身的解析器和优化器

Impala劣势数据库
- 对内存依赖大
- C++编写 开源?!(对Java单纯的程序员来讲太坑爹了。。。)
- 彻底依赖于hive
- 实践过程当中 分区超过1w 性能严重下降低(1.4 以前是这样,至于2.0 以后的版本,
就好多了)
- 稳定性不如hive
impala与hive的关系apache
- Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive
的元数据库Metadata,意味着impala元数据都存储在Hive的
metastore中。而且impala兼容Hive的sql解析,实现了Hive的
SQL语义的子集,功能还在不断的完善中
- 也就是说hive活着,impala才能存在,不然随着消失
安装方式性能优化
- ClouderaManager
- 手动安装(不建议,太多坑)


Impala核心组件bash
对于impala 来说,是没有主节点的,而要理解主节点,impala statestore 和catalog server两个角色,就具有集群调节的功能,根据以上的特色,对impala 进行配置优化配置impala 内存,每个deamon 都须要配置内存,由于真正作查询工做的就是deamon 所在的节点,因此impala 的总内存,就是全部deamon 节点的内存之和;若是要在哪台机器上面汇总,就须要在那一台机器上的内存调大一些;咱们了解到的,真正提供查询的是deamon,那么咱们链接哪一台呢?Impala,你能够链接其中deamon 任何一个都行,能够根据本身的需求来,(1)当你查询的量相对大的时候,你就链接内存大的机器,(2)当每台机器都适合查询的状况下也能够随机找一台机器,本身写一个轮询或者权重算法;解决高并发问题
- Statestore Daemon
- 负责收集分布在集群中各个impalad 进程的资源信息,各节点健康情况、同步节点信息.
负责query 的调度.(并不是绝对,假若他存在,那就帮忙,若不存在,那就不用他)
对于一个正常运转的集群,并非一个关键进程.
- Catalog Daemon(1.2 版本以后才加入)
- 把impala表的metadata分发到各个impalad 中,说他是基于hive 的,因此就须要metadata数据分到impalad 中,之前没有此进程,就是手动来进行同步的。虽然以后加入了,可是也没有那么智能,并非保证全部的数据都能同步,好比你插入一些数据,他能够把数据发到其余节点,可是好比建立表ddl 语句,建议去手动作一下。接收来自statestore 的全部请求,当impala deamon节点插入或者查询数据时候(数据改变的时候),他把本身的操做结果汇报给state deamon,而后state store 请求catelog deamon,告知从新更新元数据信息给impalad 中,因此catalog deamon 与statedeamon 放到一台机器上,并且不建议在此机器上再去安装impala deamon 进程,避免形成提供查询形成集群管理出问题
- Impala Daemon(主要来提供查询)
- 主要接收查询请求,接收client、hue、jdbc 或者odbc 请求、query 执行并返回给中心协调节点(对应的服务实例是impalad)子节点上的守护进程,负责向statestore 保持通讯,汇报工做

Impala架构

- Client(shell,jdbc,odbc)发送请求到impalad 进程上,发送节点能够是随机的,impalad 之间,也有相互通讯
- Statestore 和catelog 划到同一节点,目的就是这两个进程在协调工做时候,避免因网络问题形成失败
- Hive metastore 是比较重要的,此时statestore 和catelog 通讯,将数据同步到其余节点
- Impalad 最好与hdfsDataNode 在同一节点,这样能更快速的查询计算,而后返回结果便可(理想状态的就是数据本地化)
- Impalad 里面包含三个组件
- Query planner(查询解析器)
- ii. Query coordinator(中心协调节点)
- 由这个组件来指定来查询的主节点(头),指定好以后通知其余节点个人主节点做用,待大家查询完成以后的结果,返回给头节点
- Query executor(查询执行器)
impala 外部shell
- -h(--help)帮助-------查看全部命令的帮助文档
- -r(--refresh_after_connect)刷新全部元数据(当hive 建立数据的时候,你须要刷新到,才能看到hive 元数据的改变)总体刷新*---全量刷新,万不得已才能用;不建议定时去刷新hive 源数据,数据量太大时候,一个刷新,颇有可能会挂掉;建立hive 表,而后刷新。
- -B(--delimited)去格式化输出* 大量数据加入格式化,性能受到影响
- --output_delimiter=character 指定分隔符与其余命令整合
- --print_header 打印列名(去格式化,可是显示列名字)
- -v 查看对应版本(会有坑)
- Impala 的查询会以最新版本为准,若是版本不一致,会形成查询结果失败
- mpala-shell 与impala 的版本查看,必须版本一致
- -f 执行查询文件*
select name,count(name) as name_count from person group by name--建立包含该sql的文件
- --query_file 指定查询文件(建议sql 语句写到一行,由于shell 会读取文件一行一行的命令)
- Impala-shell --query_file=xxx
- -i 链接到对应的impalad
- --impalad 指定impalad 去执行任务
- --fe_port 指定备用端口(一般不用去指定)
- -o 保存执行结果到文件***
- 组合应用:
impala-shell -B --Print_header -f test.sss -o result.txt
Impala-shell -B -f test.xxx -o result.txt
非重要的shell
- mpala-shell 命令用法:
- Impala-shell --user root
- -u 执行某一用户运行impala-shell
- --user 指定用户执行shell 命令
- --ssl 经过ssl 验证方式方式执行
- --ca_cert 指定第三方用户证书
- --config_file 临时指定配置文件
- -p 显示执行计划
-
-q 不进入impala-shell 执行查询
-
-c 忽略错误语句继续执行
-
-d 指定进入某一个数据库
Impala-shell(内部shell)
Impala 存储与分区
- 须要注意的是impala 除了所有支持hive 的文件类型,本身还支持parquet 这样的文件类型,固然了,这个类型并非impala 本身独有的,好比spark sql,shark sql 都支持这样的类型;Rcfile 自己快一些,可是不如text 才作起来更方便

- 压缩方式

- 添加分区方式
--一、partitioned by 建立表时,添加该字段指定分区列表
--二、使用alter table 进行分区的添加和删除操做
• create table t_person(id int, name string, age int) partitioned by (type string);
• alter table t_person add partition (type='man');
• alter table t_person drop partition (type='man');
• alter table t_person drop partition (sex='man',type='boss');
-
分区内添加数据
insert into t_person partition (type='boss') values (1,'zhangsan',18),(2,'lisi',23)
insert into t_person partition (type='coder') values
(3,'wangwu',22),(4,'zhaoliu’,28),(5,'tianqi',24)
-
查询指定分区数据
select id,name from t_person where type='coder'
impala-SQL、JDBC、性能优化
- 加载数据:
- insert 语句:插入数据时每条数据产生一个数据文件,不建议用此方式加载批量数据
- load data 方式:在进行批量插入时使用这种方式比较合适
- 来自中间表:此种方式使用于从一个小文件较多的大表中读取文件并写入新的表生产少许的数据文件。也能够经过此种方式进行格式转换。
- 空值处理:
- impala 将“\n”表示为NULL,在结合sqoop 使用是注意作相应的空字段过滤,也可使用如下方式进行处理:
alter table name set tblproperties (“serialization.null.format”=“null”)
-
配置:
– impala.driver=org.apache.hive.jdbc.HiveDriver
– impala.url=jdbc:hive2://node2:21050/;auth=noSasl
– impala.username=
– impala.password=
-
尽可能使用PreparedStatement执行SQL语句:
-
执行计划
-
– 查询sql执行以前,先对该sql作一个分析,列出须要完成这一项查询的
详细方案(命令:explain sql、profile)
总结:
一、SQL优化,使用以前调用执行计划
二、选择合适的文件格式进行存储
三、避免产生不少小文件(若是有其余程序产生的小文件,可使用中间
表)
四、使用合适的分区技术,根据分区粒度测算
五、使用compute stats进行表信息搜集
六、网络io的优化:
a.避免把整个数据发送到客户端
b.尽量的作条件过滤
c.使用limit字句
d.输出文件时,避免使用美化输出
七、使用profile输出底层信息计划,在作相应环境优化
Impala SQL VS HiveQL
- 支持数据类型
- INT
- TINYINT
- SMALLINT
- BIGINT
- BOOLEAN
- CHAR
- VARCHAR
- STRING
- FLOAT
- DOUBLE
- REAL
- DECIMAL
- TIMESTAMP
- CDH5.5版本之后才支持一下类型
- 此外,Impala不支持HiveQL如下特性:
- – 可扩展机制,例如:TRANSFORM、自定义文件格式、自定义SerDes
- – XML、JSON函数
- – 某些聚合函数:
- covar_pop, covar_samp, corr, percentile,percentile_approx, histogram_numeric, collect_set
- Impala仅支持:AVG,COUNT,MAX,MIN,SUM
- – 多Distinct查询
- – HDF、UDAF
Impala SQL(和Hive相似)
- 视图
- – 建立视图:create view v1 as select count(id) as total from tab_3 ;
- – 查询视图:select * from v1;
- – 查看视图定义:describe formatted v1
- 注意:
- 不能向impala的视图进行插入操做
- insert 表能够来自视图