Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。
基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。
是CDH平台首选的PB级大数据实时查询分析引擎。
1.1 Impala的优缺点
1.1.1 优点
1.1.2 缺点
从上图可以看出,impala自身包含三个模块:impalad、statestore和catalog,除此之外它还依赖Hive Metastore和HDFS。
1)impalad:
接收client的请求、query执行并返回给中心协调节点;
子节点上的守护进程,负责向statestore保持通信,汇报工作。
2)catalog:
分发表的元数据信息到各个impalad中;
接收来自statestore的所有请求。
3)statestore:
负责收集分布在集群中各个impalad进程的资源信息、各节点健康状况,同步节点信息;
负责query的协调调度。
1.impala的官网Impala
2.impala文档查看Impala
3.下载地址Impala
>cloudera manager(CDH首推)
>手动安装
>配置Impala 高可用
现在的Impala 并不支持高可用,一旦我们连接的impalad 进程节点崩溃,就必须得手动换一个节点或者等待这个节点恢复正常。
暂时有个方法就是在Impala 外面在包一层 haproxy 代理 实现impala 的四层负载均衡,从而实现Impala HA。
官方文档连接:Using Impala through a Proxy for High Availability | 6.3.x | Cloudera Documentation
可以通过下面的链接来访问impala监护管理页面:
查看statestore:http://集群名(或者IP):25020/
查看catalog:http:// 集群名(或者IP):25010/
使用CDH安装在clound manager中可以看到,端口号不用记
向表中导入数据
load data inpath ‘文件所在路径’ into table 表名;
注意:
1) 关闭(修改hdfs的配置dfs.permissions为false)或修改hdfs的权限,否则impala没有写的权限
修改权限:hadoop fs –chmod –R 777 文件路径
2)impala不支持将本地文件导入到表中,可以把本地文件上传到HDFS
选项 |
描述 |
-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,--output_file filename |
保存所有查询结果到指定的文件。通常用于保存在命令行,使用-q选项执行单个查询时的查询结果。 |
-c |
查询执行失败时继续执行 |
-d default_db,--database=default_db |
指定启动后使用的数据库,与建立连接后使用use语句 选择数据库作用相同,如果没有指定,那么使用default数据库 |
-r ,--refresh_after_connect |
建立连接后刷新impala元数据 |
-p,--show_profiles |
对shell中执行的每一个查询,显示其查询执行计划 |
-B,--delimited |
去格式化输出 |
--output_delimited=character |
指定分隔符 |
--print_header |
打印列名 |
选项 |
描述 |
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 表名;
查询最近一次查询的底层信息:select count(*) from 表名;
profile;
shell命令:
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创建表
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT datebase_comment]
[LOCATION hdfs_path];
注:impala不支持with dbproperties…语法
5.2.1 显示数据库
show databases;
show databases like ‘rrs_*’;
show tables in apex_report like 'rrs_region*';
select current_database();
describe database apex_report;
注:_impala_builtins --System database for Impala builtin functions(Impala内置函数的系统数据库)
知识点补充:(hive与impala内置函数区别)
查看内置的函数
hive不需要进入什么内置数据库, 即可使用show functions命令列出所有内置的函数.
show functions; -- hive仅显示函数的名称, 没有参数和返回值信息.
desc function function_name ; -- 该命令能显示函数的具体用途.
impala需要先进入_impala_builtins数据库,才能使用show functions命令列出所有内置的函数.
use _impala_builtins;
show functions;
impala当中的元数据的同步的问题
impala当中创建的数据库表,不用刷新,直接就可以看得到
hive当中创建的数据库表,需要刷新元数据才能够看得到
因为impala的catalog的服务,我们需要通过刷新机制,将hive当中表的元数据信息,保存到catalog里面来,impala才能够看得到
5.2.2 删除数据库
drop database apex_report; --只能删除空数据库(数据库中没有表)
drop database apex_report cascade; --强制删除数据库不管是否空数据库
注:impala不支持alter database语法
当数据库被use语句选中时,无法删除
不支持分桶表。
5.3.1 管理表
create table if not exists student (id int,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘路径’;
desc formatted student;
5.3.2 外部表
create external table external_student (id int,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘路径’;
5.4.1 创建分区表
create table student_partition (id int,name string) partitioned by (month string) row format deleimited fields terminated by ‘\t’;
5.4.2 向分区表导入数据:
(这里的路径是HDFS路径,不是本地路径)
1.load date inpath “/student.txt” into table student_partition partition (month=’10’);
使用此方法导入数据时,会报错,需要先添加分区,再导入数据,解决办法:
alter table student_partition add partition (month=’10’);
load date inpath “/student.txt” into table student_partition partition (month=’10’);
2.使用insert插入数据时,即创建分区又导入数据
insert into table student_partition partition (month=’11’) select * from student;
注意:如果分区没有,使用load data导入数据时,不能自动创建分区。
5.4.3 查询分区表数据
select * from student_partition where month = ‘10’;
5.4.4 增加多个分区
alter table student_partition add partition (month=’201911’) partition (month=’201910’);
5.4.5 删除分区
alter table student_partition drop partition (month=’201910’);
不支持删除多个分区,单次只能删除一个分区
5.4.6 查看分区
show partitions student_partition;
注意:impala不支持load data local inpath ……
1.impala不支持insert overwrite ……语法导出
2.impala数据导出一般使用impala –o
impala-shell –q ‘slelect * from student;’ –B –output_delimiter=’\t’ –o output.txt
真实案例:impala-shell -q 'select * from apex_report.test_test' -i rrs-hdp-dn01:25003 -u root -l --auth_creds_ok_in_clear --ldap_password_cmd="echo -n 'Haier,123'" -B --output_delimiter=',' -o output.txt
cat output.txt
Impala不支持export和import命令。
select * from (select *,rank() over(partition by zxbm order by danjia desc) rank from apex_report.test_test) t1 where rank <= 3;
自定义函数
hadoop fs –put /opt/test/hive.jar /
Create function mylower(string) returns string location ‘/hive.jar’ symbol=’类名全路径(包名+类名)’;
Select mylower(‘NAME’);
Show functions;
文件格式 |
压缩编码 |
Impala是否可直接创建 |
是否可直接插入 |
Parquet |
Snappy(默认),GZIP |
Yes |
支持:create table,insert,查询 |
TextFile |
LZO,gzip,bzip2,snappy |
Yes,不指定stored as子句的create table语句,默认的文件格式就是未压缩文本 |
支持:create table,insert,查询。如果使用LZO压缩,则必须在hive中创建表和加载数据 |
RCFile |
Snappy,GZIP,deflate,BZIP2 |
Yes |
支持create,查询,在hive中加载数据 |
SequenceFile |
Snappy,GZIP,deflate,BZIP2 |
Yes |
支持:create table,insert,查询。需设置 |
注:impala不支持ORC格式
可以通过设置set COMPRESSION_CODEC = gzip;来更改压缩编码方式,如果想取消设置,使用:unset COMPRESSION_CODEC;即可还原压缩编码方式。
压缩编码方式是否设置成功,可以通过表的大小来确认。
避免把整个数据发送到客户端
尽可能地做条件过滤
使用limit子句
输出文件时,避免使用美化输出
尽量少用全量元数据地刷新