第1章 impala基本概念
1 什么是impala
Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。
基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。
是CDH平台首选的PB级大数据实时查询分析引擎。
1.1 Impala的优缺点
1.1.1 优点
- 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销
- 无需转换MapReduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。
- 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销
- 支持各种文件格式,如TEXTFILE、SEQUENCEFILE、RCFile、Parquet。
- 可以访问hive地metastore,对hive数据直接做数据分析。
1.1.2 缺点
- 对内存的依赖大,且完全依赖于hive
- 实践中,分区个数超过1万,性能严重下降
- 只能读取文本文件,而不能直接读取自定义二进制文件
- 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新
1.2 impala的架构
从上图可以看出,impala自身包含三个模块:impalad、statestore和catalog,除此之外它还依赖Hive Metastore和HDFS。
1)impalad:
接收client的请求、query执行并返回给中心协调节点;
子节点上的守护进程,负责向statestore保持通信,汇报工作。
2)catalog:
分发表的元数据信息到各个impalad中;
接收来自statestore的所有请求。
3)statestore:
负责收集分布在集群中各个impalad进程的资源信息、各节点健康状况,同步节点信息;
负责query的协调调度。
第2章 impala安装
2.1 impala的地址
1.impala的官网http://impala.apache.org/downloads.html
2.impala文档查看http://impala.apache.org/impala-docs.html
3.下载地址http://impala.apache.org/downloads.html
2.2 impala的安装方式
>cloudera manager(CDH首推)
>手动安装
>配置Impala 高可用
现在的Impala 并不支持高可用,一旦我们连接的impalad 进程节点崩溃,就必须得手动换一个节点或者等待这个节点恢复正常。
暂时有个方法就是在Impala 外面在包一层 haproxy 代理 实现impala 的四层负载均衡,从而实现Impala HA。
官方文档连接:https://docs.cloudera.com/documentation/enterprise/latest/topics/impala_proxy.html
2.3 impala监护管理
可以通过下面的链接来访问impala监护管理页面:
查看statestore:http://集群名(或者IP):25020/
查看catalog:http:// 集群名(或者IP):25010/
使用CDH安装在clound manager中可以看到,端口号不用记
2.4 impala初体验
向表中导入数据
load data inpath ‘文件所在路径’ into table 表名;
注意:
1) 关闭(修改hdfs的配置dfs.permissions为false)或修改hdfs的权限,否则impala没有写的权限
修改权限:hadoop fs –chmod –R 777 文件路径
2)impala不支持将本地文件导入到表中,可以把本地文件上传到HDFS
第3章 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,--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 |
打印列名 |
3.2 impala的内部shell
选项 |
描述 |
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) |
history |
历史命令 |
查看执行计划:explain select * from 表名;
查询最近一次查询的底层信息:select count(*) from 表名;
profile;
shell命令:
第4章 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创建表
第5章 DDL数据定义
5.1创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT datebase_comment]
[LOCATION hdfs_path];
注:impala不支持with dbproperties…语法
5.2 查询数据库
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 创建表
不支持分桶表。
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 分区表
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;
第6章 DML数据操作
6.1 数据的导入(基本同hive类似)
注意:impala不支持load data local inpath ……
6.2 数据导出
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命令。
第7章 查询
- 基本的语法跟hive的查询语句大体一样
- Impala不支持CLUSTER BY,DISTRIBUTE BY,SORT BY
- Impala中不支持分桶表,不支持抽样查询
- Impala不支持COLLECT_SET(col)和explode(col)函数
- Impala支持开窗函数
select * from (select *,rank() over(partition by zxbm order by danjia desc) rank from apex_report.test_test) t1 where rank <= 3;
第8章 函数
自定义函数
hadoop fs –put /opt/test/hive.jar /
Create function mylower(string) returns string location ‘/hive.jar’ symbol=’类名全路径(包名+类名)’;
Select mylower(‘NAME’);
Show functions;
- 创建一个maven工程
- 导入依赖
- 创建一个类
- 打成jar包上传到服务器(一个路径,例如:/opt/test/hive.jar)
- 将jar包上传到hdfs地指定目录(例如根目录)
- 创建函数
- 使用自定义函数
- 通过show functions查看自定义的函数
第9章 存储和压缩
文件格式 |
压缩编码 |
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;即可还原压缩编码方式。
压缩编码方式是否设置成功,可以通过表的大小来确认。
第10章 优化
- 尽量将statestore和catalog单独部署到同一个节点,保证他们正常通行。
- 通过对impala daemon内存限制(默认256M)及statestore工作线程数,来提高impala的执行效率。
- SQL优化,使用之前调用执行计划
- 选择合适的文件格式进行存储,提高查询效率
- 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert ……select ……方式中间表的数据插入到最终表中)
- 使用合适的分区技术,根据分区粒度测算
- 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值得数量差异可能导致impala选择不同得连接顺序时进行查询。
- 使用profile输出底层信息计划,在做相应环境优化
- 网络io的优化
避免把整个数据发送到客户端
尽可能地做条件过滤
使用limit子句
输出文件时,避免使用美化输出
尽量少用全量元数据地刷新