Impala是什么?
Impala是Cloudera公司推出,提供对HDFS,Hbase数据的高性能,低延迟的交互式SQL查询;
基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点;
是CDH平台首选的PB级别大数据实时查询分析引擎。
优点:基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销;
无需转化为MapReduce,直接访问存储在HDFS,Hbase中的数据进行作业调度,速度快;
使用了支持Data locality(数据本地化)的I/O调度机制,尽可能地将数据和计算分配在同一台机器上,减少了网络开销;
支持各种文件格式,如textfile、sequencefile、rcfile、parquet;
可以访问hive的metastore,对hive数据直接做数据分析
缺点:对内存依赖大,且完全依赖hive;
实际情况中,分区超过1万,性能严重下降;
只能读取文本文件,不能直接读取自定义二进制文件;
每当新的记录、文件被添加到HDFS中的数据目录时,该表需要被刷新。
Impala的架构
从上图可以看出,Impala自身包含三个模块:Impalad、Statestore和Catalog,除此之外它还依赖Hive Metastore和HDFS。
1.Impalad:
接收client的请求、Query执行并返回给中心协调节点;
子节点上的守护进程,负责向statestore保持通信,汇报工作。
2.Catalog:
分发表的元数据信息到各个impalad中;
接收来自statestore的所有请求。
3.Statestore:
负责收集分布在集群中各个impalad进程的资源信息、各节点健康状况,同步节点信息;
负责query的协调调度。
Impala是怎么处理来自客户端的一条SQL?
从上图看出:客户端发送一条SQL到Impalad,
①、Impala首先会把这条SQL语句转化为一个Query Planner(查询计划);
②、然后Impala会将Query Planner交给Query Coordinator(中心协调器);
③、Query Coordinator(中心协调器)将查询计划交给Query Executor(执行器);注意,并不是交给任意的执行器处理,若查询的数据在当前中心协调器节点上,则会交给当前节点的执行器执行,若数据在其他节点上,该中心协调器会将执行计划交给其他节点的执行器执行(体现了Data locality(数据本地化));
④、执行器执行完成之后,会将结果返回给中心协调器,中心协调器再将数据响应给客户端;
执行器之间可以交互是因为数据可能不仅仅存在于一台节点上。
Impala访问HDFS和本地目录的方式:
hive cli 中查看hdfs目录:dfs -ls /
hive cli 中查看本地目录:! ls /
beeline中查看hdfs目录:! sh hadoop fs /
beeline中查看本地目录:! sh ls /
impala中查看hdfs目录 :shell hadoop fs -ls /
impala中查看本地目录 :shell fs -ls /
Impala的外部shell
选项 | 描述 |
---|---|
-h或–help | 显示帮助信息 |
-v或–version | 显示版本信息 |
-i |
指定连接运行impala守护进程的主机 例:impala-shell -i hadoop102 |
-r |
建立连接后刷新 Impala 元数据 例:impala-shell -i hadoop102 -r; |
-q |
从命令行中传递一个shell命令 例:impala-shell -i hadoop102 -q ‘select * from tbl’; |
-f |
执行一个文件中的sql脚本 例:impala-shell -i hadoop102 -f /query.sql; |
-o |
保存查询的结果到指定文件中 例:impala-shell -i hadoop102 -q ‘select * from tbl’ -o /output.txt; |
-B |
去格式化输出 例:impala-shell -i hadoop102 -q ‘select * from tbl’ -B; |
–output_delimiter |
指定输出时字段间分隔符 例:impala-shell -i hadoop102 -q ‘select * from tbl’ –output_delimiter=’&’; |
Impala的内部命令:
选项 | 描述 |
help | 显示帮助信息 |
explain<sql> | 显示执行计划 |
profile |
(查询完成后执行) 查询最近一次查询的底层信息 |
shell<shell> |
不退出impala-shell执行shell命令 |
version |
显示版本信息(同于impala-shell -v) |
connect |
连接impalad主机,默认端口21000(同于impala-shell -i) |
refresh <tablename> |
增量刷新元数据库 |
invalidate metadata |
全量刷新元数据库(慎用)(同于 impala-shell -r) |
Impala数据类型的
Hive数据类型 | Impala数据类型 | 长度 |
tinyint | tinyint |
1byte有符号整数 |
smalint | smalint |
2byte有符号整数 |
int | int |
4byte有符号整数 |
bigint | bigint |
8byte有符号整数 |
boolean | boolean |
布尔类型,true或者false |
float | float |
单精度浮点数 |
double | double |
双精度浮点数 |
string | string |
字符系列。可以指定字符集。可以使用单引号或者双引号 |
timestamp | timestamp | 时间类型 |
binary | 不支持 | 字节数组 |
注意:Impala虽然支持array,map,struct复杂数据类型,但是支持并不完全,一般处理方法,将复杂类型转化为基本类型,通过hive创建表。
DDL操作(注意事项):
Impala不支持WITH DEPROPERTIE…语法
Impala不支持alter database语法(因为不支持with dbproperties)
当数据库被use语句选中时,无法删除
分区表中,如果分区没有,load data导入数据时,不能自动创建分区。
DML操作(注意事项):
Impala不支持load data local inpath;
Impala不支持 insert overwrite….语法导入数据;
Impala不支持 export 和 import 命令。
查询相关:
不支持CLUSTER BY, DISTRIBUTE BY, SORT BY;
Impala中不支持分桶表;
Impala不支持COLLECT_SET(col)和explode(col)函数;
支持开窗函数。
存储和压缩(注:Impala不支持ORC格式)
文件格式 | 压缩编码 | Impala是否可直接创建 | 是否支持插入 |
---|---|---|---|
parquet | Snappy(默认)、GZIP | yes |
支持:CREATE TABLE, INSERT, 查询 |
TextFile | LZO、gzip、bzip2、snappy | yes |
支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据 |
RCFile | snappy、gzip、deflate、bzip2 | yes |
支持CREATE,查询,在 Hive 中加载数据 |
SequenceFile | snappy、gzip、deflate、bzip2 | yes |
支持:CREATE TABLE, INSERT, 查询。需设置 |
优化:
- 尽量将StateStore和Catalog单独部署到同一个节点,保证他们正常通信。
- 通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率。
- SQL优化,使用之前调用执行计划
- 选择合适的文件格式进行存储,提高查询效率。
- 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中)
- 使用合适的分区技术,根据分区粒度测算
- 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala选择不同的连接顺序时进行查询。
- 网络io的优化:
- 避免把整个数据发送到客户端
- 尽可能的做条件过滤
- 使用limit字句
- 输出文件时
- 避免使用美化输出
- 尽量少用全量元数据的刷新
- 使用profile输出底层信息计划,在做相应环境优化
今天的文章Impala框架分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/9543.html