目录
一、Impala 概述
1.1 什么是 Impala
Impala是性能最高的SQL引擎,他提供了访问存储在Hadoop分布式文件系统中的数据最快方法。
impala与hive相比较如下表
执行引擎 | 元数据 | 计算时存储 | |
---|---|---|---|
Impala | impala | 依赖hive元数据 | 计算时基于内存 |
Hive | yarn | 依赖hive元数据 | 基于HDFS |
2.2 Impala 的功能
- Impala基于内存,即,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动(数据本地化)。
- 可以使用Impala使用类SQL查询访问数据。
- 与其他SQL引擎相比,Impala为HDFS中的数据提供了更快的访问。
- 使用Impala,可以将数据存储在存储系统中,如HDFS,Apache HBase和Amazon s3。
- 可以将Impala与业务智能工具(如Tableau,Pentaho,Micro策略和缩放数据)集成。
- Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。
- Impala基于Apache Hive的元数据,ODBC驱动程序和SQL语法。
- Impala可以根据Apache许可证作为开源免费提供。
2.3 Impala 的优缺点
(1)优点:
- 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。
- 无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。
- 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。
- 支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。
- 可以访问hive的metastore,对hive数据直接做数据分析。
(2)缺点:
- 对内存的依赖大,且完全依赖于hive。
- 实践中,分区超过1万,性能严重下降。
- 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。
2.4 关系数据库和impala
Impala使用类似于SQL和HiveQL的Query语言。 下表描述了SQL和Impala查询语言之间的一些关键差异。
Impala | 关系型数据库 |
---|---|
Impala使用类似于HiveQL的类似SQL的查询语言。 | 关系数据库使用SQL语言。 |
在Impala中,您无法更新或删除单个记录。 | 在关系数据库中,可以更新或删除单个记录。 |
Impala不支持事务。 | 关系数据库支持事务。 |
Impala不支持索引。 | 关系数据库支持索引。 |
Impala存储和管理大量数据(PB)。 | 与Impala相比,关系数据库处理的数据量较少(TB)。 |
2.5 Hive,Hbase和Impala
虽然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的语言。 |
二、Impala 架构
Impala是在Hadoop集群中的许多系统上运行的MPP(大规模并行处理)查询执行引擎。 与传统存储系统不同,impala与其存储引擎解耦。 它有三个主要组件,即Impala Statestore,Impala daemon(Impalad)和Impala元数据或metastore。
Impala Statestore:对应进程statestored。用于跟踪各个impalad实例的位置和状态,让各个impalad实例以集群的方式运行起来。如果挂掉了,impalad实例却仍然会保持集群的方式处理查询请求,但是不能够识别新的impalad实例。
Impala daemon:对应进程impalad,数据计算进程。每个DataNode上有一个。接收客户端的查询并返回结果给客户端。可并发处理请求。
Impala 元数据和元存储:表定义等细节存储在元存储的集中式数据库,本地缓存所有元数据。
查询处理接口:impala-shell,Hue,ODBC/JDBC 驱动程序
Impala查询执处理过程:
- 用户程序通过JDBC、ODBC、Impala Shell等Impala 客户端发送Sql语句给Impala;
- 用户程序连接到集群中任意Impalad进程,这一进程作为整个查询的协调器;
- Impala解析、分析查询,确定哪些任务由集群中哪一Impalad实例执行,并生成最优执行计划;
- Impalad实例访问对应HDFS、HBase服务,获取数据;
- 每一个Impalad实例将数据返回给协调器Impalad,由其发送结果给客户端。
三、Impala的操作命令
3.1 Impala的外部shell
选项 | 描述 |
---|---|
-h, --help | 显示帮助信息 |
-v or --version | 显示版本信息 |
-i hostname, --impalad=hostname | 指定连接运行 impalad 守护进程的主机。默认端口是 21000。 |
-q query, --query=query | 从命令行中传递一个shell 命令。执行完这一语句后 shell 会立即退出。 |
-f query_file, --query_file= query_file | 传递一个文件中的 SQL 查询。文件内容必须以分号分隔 |
-o filename or --output_file filename
| 保存所有查询结果到指定的文件。通常用于保存在命令行使用 -q 选项执行单个查询时的查询结果。 |
-c | 查询执行失败时继续执行 |
-d default_db or --database=default_db | 指定启动后使用的数据库,与建立连接后使用use语句选择数据库作用相同,如果没有指定,那么使用default数据库 |
-r or --refresh_after_connect | 建立连接后刷新 Impala 元数据 |
-p, --show_profiles | 对 shell 中执行的每一个查询,显示其查询执行计划,用于优化sql的。 |
-B(--delimited) | 去格式化输出,也就是直接显示结果,没有那些条框 |
--output_delimiter=character | 指定分隔符 |
--print_header | 打印列名 |
1. 连接指定hadoop005的impala主机
[root@hadoop004 datas]# impala-shell -i hadoop005
2. 使用-q查询表中数据,并将数据写入文件中
[root@hadoop005 ~]$ impala-shell -r -q 'select * from student' -o output.txt
3. 查询执行失败时继续执行
[root@hadoop005 ~]$ vim impala.sql
select * from student;
select * from stu;
select * from student;
[root@hadoop005 ~]$ impala-shell -f impala.sql;
[root@hadoop005 ~]$ impala-shell -c -f impala.sql;
4. 在hive中创建表后,使用-r刷新元数据
hive> create table stu(id int, name string);
[hadoop005:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| student |
+---------+
[root@hadoop005 ~]$ impala-shell -r
[hadoop005:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| stu |
| student |
+---------+
5. 显示查询执行计划 (所谓执行计划,即在查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案)
[root@hadoop005 ~]$ impala-shell -p
[hadoop005:21000] > select * from student;
6.去格式化输出
[root@hadoop005 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
[root@hadoop005 ~]# cat output.txt
1001 tignitgn
1002 yuanyuan
1003 haohao
1004 yunyun
3.2 Impala的外部shell
描述 | |
---|---|
help | 显示帮助信息 |
explain <sql> | 显示执行计划 |
profile | (查询完成后执行) 查询最近一次查询的底层信息 |
shell <shell> | 不退出impala-shell执行shell命令 |
version | 显示版本信息(同于impala-shell -v) |
connect | 连接impalad主机,默认端口21000(同于impala-shell -r) |
refresh <tablename> | 增量刷新元数据库 |
invalidate metadata | 全量刷新元数据库(慎用)(同于 impala-shell -r) |
history | 历史命令 |
1. 查看执行计划
explain select * from student;
2. 查询最近一次查询的底层信息
[hadoop005:21000] > select count(*) from student;
[hadoop005:21000] > profile;
3. 查看hdfs及linux文件系统
[hadoop005:21000] > shell hadoop fs -ls /;
[hadoop005:21000] > shell ls -al ./;
4. 刷新指定表的元数据
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
[hadoop005:21000] > select * from student;
[hadoop005:21000] > refresh student;
[hadoop005:21000] > select * from student;
5. 查看历史命令
[hadoop005:21000] > history;
四、Impala 的 SQL 操作
4.1 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创建表。
4.2 数据库操作
--1.创建命令
-- Impala不支持WITH DBPROPERTIE…语法
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
-- 2.显示数据库
show databases;
show databases like 'hive*';
-- 3. 删除数据库
-- Impala不支持alter database语法 当数据库被 USE 语句选中时,无法删除
drop database hive_db;
drop database hive_db cascade;
-- 4. 切换数据库
use default;
4.3 Impala 表操作
4.3.1 创建表
--管理表(内部表)
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';
--查看表结构
desc formatted student2;
--外部表
create external table stu_external(
id int,
name string)
row format delimited fields terminated by '\t' ;
-- 查看表结构
desc formatted stu_external;
4.3.2 分区表
--创建分区表
create table stu_par(id int, name string)
partitioned by (month string)
row format delimited
fields terminated by '\t';
--向表中导入数据
alter table stu_par add partition (month='201810');
load data inpath '/user/hive/warehouse/student.txt' into table stu_par partition(month='201810');
insert into table stu_par partition (month = '201811') select * from student;
--注意:如果分区没有,load data导入数据时,不能自动创建分区。
--Load data时,只能从hdfs上load数据,不能从Linux本地load,即不能使用local语法
--查询分区表中的数据
select * from stu_par where month = '201810';
--增加多个分区
alter table stu_par add partition (month='201812') partition (month='201813');
--删除分区
alter table stu_par drop partition (month='201812');
--查看分区
show partitions stu_par;
4.3.3 插入数据
--创建一张表
create table doctor(id int, name string,age int) row format delimited fields terminated by '\t';
--通过insert插入数据
insert into table doctor values(1,'tom',18);
insert into table doctor (name,age) values('cat',19);
--进行覆盖插入,前边需要加overwrite
insert overwrite table doctor values(1,'hello',20);
--根据查询结果创建表(查询的结果会添加到新创建的表中)
create table if not exists doctor2 as select id, name from doctor;
--创建表时通过location指定加载数据路径
create table if not exists doctor3(
id int, name string,age int
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/doctor3';
4.3.4 导出数据
impala不支持insert overwrite…语法导出数据
impala 数据导出一般使用 impala -o
[root@hadoop004 ~]# impala-shell -q 'select * from doctor' -B --output_delimiter="\t" -o output.txt
[root@hadoop004 ~]# cat output.txt
1 hello 20
Impala 不支持export和import命令
4.3.5 select查询
- 基本的语法跟hive的查询语句大体一样
- Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
- Impala中不支持分桶表
- Impala不支持COLLECT_SET(col)和explode(col)函数
4.3.6 其他操作
--描述表
describe doctor;
-- alter table
--表重新名,例如将doctor重命名为newdoctor
alter table doctor rename to newdoctor;
--向表中添加列,例如向newdoctor表中添加tel列和addr列。
alter table newdoctor add columns (tel string,addr string);
--删除列,例如把newdoctor表中的age列删除,删除后会发现数据错位。
alter table newdoctor drop age;
--更改列的名称和类型,例如将tel改为telephone int类型。
alter table newdoctor change tel telepnhone int;
--drop table
--Impala drop table语句用于删除Impala中的现有表。 如果删除的是内部表,则会将表对应的hdfs目录删除,如果是外部表,则会保留hdfs目录。
drop table default.student;
--truncate table
--Impala的Truncate Table语句用于从现有表中删除所有记录,但是会保留表结构。
truncate newdoctor;
--show tables
show tables;
--创建视图
create view emp_view as select empno,ename,job from emp;
--查询视图
select * from emp_view;
--删除视图
drop view emp_view;
4.4 Impala 条款
4.4.1 ORDER BY子句
Impala ORDER BY子句用于根据一个或多个列以升序或降序对数据进行排序。 默认情况下,一些数据库按升序对查询结果进行排序。以下是ORDER BY子句的语法。
select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。以同样的方式,如果我们使用NULLS FIRST,表中的所有空值都排列在顶行; 如果我们使用NULLS LAST,包含空值的行将最后排列。
--将员工表按照奖金升序排序,如果有空值,将空值放在顶行。
select * from emp order by comm nulls first;
--将员工表按照奖金升序排序,如果有空值,将空值放在尾行。
select * from emp order by comm nulls last;
4.4.2 偏移条款
一般来说,select查询的结果中的行从0开始。使用offset子句,我们可以决定从哪里考虑输出。 例如,如果我们选择偏移为0,结果将像往常一样,如果我们选择偏移为2,结果从第2行开始。
select * from emp order by empno limit 4;
select * from emp order by empno limit 4 offset 0;
select * from emp order by empno limit 4 offset 2;
4.4.3 Union条款
可以使用Impala的Union子句组合两个查询的结果,分为Union和Union all。
Union:对两个结果集进行并集操作,会进行去重,不包括重复行;
Union All:对两个结果集进行并集操作,不会进行去重,包括重复行;
select * from emp limit 3 union select * from emp limit 3;
select * from emp limit 3 union all select * from emp limit 3;
4.4.4 with子句
如果查询太复杂,我们可以为复杂部分定义别名,并使用Impala的with子句将它们包含在查询中。语法如下
with x as (select 1), y as (select 2) (select * from x union y);
-- 查询job = 'CLERK 和 sal > 2000 的所有人
with t1 as (select * from emp where job = 'CLERK'),
t2 as (select * from emp where sal > 2000)
(select * from t1 union select * from t2);
4.4.5 DISTINCT运算符
Impala中的distinct运算符用于通过删除重复值来获取唯一值。
select distinct columns… from table_name;
--将员工表根据job进行去重。
select distinct job from emp;
总结
文章中没有提到的SQL操作与hive中基本一致