1 概述
1.1 什么是 Impala?
Cloudera 公司推出,提供对 HDFS、Hbase 数据的高性能、低延迟的交互式 SQL 查询功能。
基于 Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。
是 CDH 平台首选的 PB 级大数据实时查询分析引擎。
1.2 Impala 的优缺点
1.2.1 优点
基于内存运算,不需要把中间结果写入磁盘,省掉了大量的 I/O 开销
无需转换为 MR,直接访问存储在 HDFS,HBase 中的数据进行作业调度,速度快
使用了支持 Data locality 的 I/O 调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销
支持各种文件格式,如 TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet
可以访问 Hive 的 metastore,对 Hive 数据直接做数据分析
1.2.2 缺点
- 对内存的依赖大,且完全依赖于 Hive
- 实践中,分区超过 1 万,性能严重下降
- 只能读取文本文件,而不能直接读取自定义二进制文件
- 每当新的记录/文件被添加到 HDFS 中的数据目录时,该表需要被刷新
1.3 Impala 的架构
[图片上传失败...(image-c7f979-1569985641812)]
1、Impalad
接收 Client 的请求、Query 执行并返回给中心协调节点
子节点上的守护进程,负责向 Statestore保持通信,汇报工作
2、Catalog
分发表的元数据信息到各个 Impalad 中
接收来自 Statestore 的所有请求
3、Statestore
负责收集分布在集群中各个 Impalad 进程的资源信息、各节点健康状况,同步节点信息
负责 Query 的协调调度
2 操作命令
2.1 外部 shell
选项 | 描述 |
---|---|
-h --help | 显示帮助信息 |
-v --version | 显示版本信息 |
-i hostname --impalad=hostname | 连接指定主机,默认端口为21000 |
-q query --query=query | 从命令行中传递一个shell命令,执行完这一语句后shell会立即退出 |
-f query_file --query_file=query_file | 传递一个sql查询文件,内容必须以分号分隔 |
-o filename --output_file filename | 保存查询结果到文件中 |
-c | 查询失败时继续执行 |
-d default_db --database=default_db | 指定启动后连接的数据库 |
-r --refresh_after_connect | 建立后刷新impala元数据 |
-p --show_profiles | 对shell中执行的每一个查询,显示其查询执行计划 |
-B | 去格式化输出 |
--output_delimiter=character | 指定分隔符 |
--print_header | 打印列名 |
连接 hadoop103 的impala 主机
[root@hadoop102 ~]# impala-shell -i hadoop103
使用 -q 查询表中数据,将结果输出到 output.txt
[root@hadoop102 ~]# impala-shell -q 'select * from student' -o output.txt
查询失败时继续执行
[root@hadoop102 ~]# vim impala.sql
select * from student;
select * from stu;
select * from student;
[root@hadoop102 ~]# impala-shell -c -f impala.sql;
在 hive 中创建表后,刷新元数据
hive> create table stu(id int, name string);
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| student |
+---------+
[root@hadoop102 ~]# impala-shell -r
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| stu |
| student |
+---------+
显示查询执行计划
[root@hadoop102 ~]# impala-shell -p
去格式化输出
[root@hadoop102 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
2.2 内部 shell
选项 | 描述 |
---|---|
help | 显示帮助信息 |
explain |
显示执行计划 |
profile | (查询完成后执行) 查询最近一次查询的底层信息 |
shell |
不退出impala-shell执行shell命令 |
version | 显示版本信息(同于impala-shell -v) |
connect | 连接impalad主机,默认端口21000(同于impala-shell -i) |
refresh |
增量刷新元数据库 |
invalidate metadata | 全量刷新元数据库(慎用)(同于 impala-shell -r) |
history | 历史命令 |
查看执行计划
explain select * from student;
查询最近一次查询的底层信息
[hadoop103:21000] > select count(*) from student;
[hadoop103:21000] > profile;
查看 hdfs 和 linux 文件系统
[hadoop103:21000] > shell hadoop fs -ls /;
[hadoop103:21000] > shell ls -al ./;
刷新指定表的元数据
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
[hadoop103:21000] > select * from student;
[hadoop103:21000] > refresh student;
[hadoop103:21000] > select * from student;
3 数据类型
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 | 不支持 | 字节数组 |
4 DDL
4.1 创建数据库
语法:
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
注:Impala不支持WITH DBPROPERTIE…语法
4.2 查询数据库
显示数据库
[hadoop103:21000] > show databases;
[hadoop103:21000] > show databases like 'hive*';
Query: show databases like 'hive*'
+---------+---------+
| name | comment |
+---------+---------+
| hive_db | |
+---------+---------+
[hadoop103:21000] > desc database hive_db;
Query: describe database hive_db
+---------+----------+---------+
| name | location | comment |
+---------+----------+---------+
| hive_db | | |
+---------+----------+---------+
删除数据库
[hadoop103:21000] > drop database hive_db;
[hadoop103:21000] > drop database hive_db cascade;
注:
Impala 不支持 alter database 语法
当数据库被 USE 语句选中时,无法删除
4.3 创建表
管理表
[hadoop103:21000] > create table if not exists student2 (id int, name string)
> row format delimited fields terminated by '\t' stored as textfile
> location '/user/hive/warehouse/student2';
[hadoop103:21000] > desc formatted student2;
外部表
[hadoop103:21000] > create external table stu_external (id int, name string)
> row format delimited fields terminated by '\t' ;
4.4 分区表
创建分区表
[hadoop103:21000] > create table stu_par(id int, name string)
> partitioned by (month string)
> row format delimited
> fields terminated by '\t';
向表中导入数据
[hadoop103:21000] > alter table stu_par add partition (month='201910');
[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201910');
[hadoop103:21000] > insert into table stu_par partition (month = '201911') select * from student;
查询分区表中的数据
[hadoop103:21000] > select * from stu_par where month = '201911';
增加多个分区
[hadoop103:21000] > alter table stu_par add partition (month='201912') partition (month='201913');
删除分区
[hadoop103:21000] > alter table stu_par drop partition (month='201912');
查看分区
[hadoop103:21000] > show partitions stu_par;
5 DML
5.1 数据导入(基本同 hive 类似)
注意:impala 不支持 load data local inpath…
5.2 数据的导出
impala 不支持 insert overwrite… 语法导出数据
impala 数据导出一般使用 impala -o
[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
Impala 不支持export和import命令
5.3 查询
基本的语法跟 hive 的查询语句大体一样
Impala 不支持 CLUSTER BY, DISTRIBUTE BY, SORT BY
Impala 中不支持分桶表
Impala 不支持 COLLECT_SET(col)和explode(col)函数
Impala 支持开窗函数
[hadoop103:21000] > select name, orderdate, cost, sum(cost) over(partition by month(orderdate)) from business;
6 优化
1、尽量将 StateStore 和 Catalog 单独部署到同一个节点,保证他们正常通信
2、通过对 Impala Daemon 内存限制(默认 256M)及 StateStore 工作线程数,来提高 Impala 的执行效率
3、SQL 优化,使用之前调用执行计划
4、选择合适的文件格式进行存储,提高查询效率
5、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表,然后通过insert…select… 方式中间表的数据插入到最终表中)
6、使用合适的分区技术,根据分区粒度测算
7、使用 compute stats 进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区,因为行和不同值的数量差异可能导致 impala 选择不同的连接顺序时进行查询
[hadoop104:21000] > show table stats student;
Query: show table stats student
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location |
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
| -1 | 1 | 67B | NOT CACHED | NOT CACHED | TEXT | false | hdfs://hadoop102:8020/user/hive/warehouse/student |
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
[hadoop104:21000] > compute stats student;
Query: compute stats student
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 1 partition(s) and 2 column(s). |
+-----------------------------------------+
[hadoop104:21000] > show table stats student;
Query: show table stats student
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location |
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
| 6 | 1 | 67B | NOT CACHED | NOT CACHED | TEXT | false | hdfs://hadoop102:8020/user/hive/warehouse/student |
+-------+--------+------+--------------+-------------------+--------+-------------------+---------------------------------------------------+
8、网络io的优化:
–a.避免把整个数据发送到客户端
–b.尽可能的做条件过滤
–c.使用limit字句
–d.输出文件时,避免使用美化输出
–e.尽量少用全量元数据的刷新
9、使用 profile 输出底层信息计划,在做相应环境优化