第1章 Impala的基本概念
1.1 什么是Impala
Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。
基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。
是CDH平台首选的PB级大数据实时查询分析引擎。
1.2 Impala优缺点
1.3 Impala组成
1.4 Impala运行原理
从上图可以看出,Impala自身包含三个模块:Impalad(impala daemon),Statestore,Catalog,除此之外,他还依赖Hive Metastore和HDFS。
Impalad:接收client的请求、query执行并返回给中心协调节点;子节点上的守护进程,负责向statestore保持通信,汇报工作。
Catalog:分发表的元数据信息到各个impalad中;接收来自statestore的所有请求。
Statestore:负责收集分布在集群中各个impala进程的资源信息、各个节点健康状态,同步节点信息;负责query的协调调度。
Impala执行查询的具体过程:
1)当用户提交查询前,Impala先创建一个负责协调客户端提交的查询的Impalad进程,该进程会向Impala State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息。
2)用户通过CLI客户端提交一个查询到impalad进程,Impalad的Query Planner对SQL语句进行解析,生成解析树;然后,Planner把这个查询的解析树变成若干PlanFragment,发送到Query Coordinator.
3)Coordinator通过从元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点。
4)Coordinator初始化相应impalad上的任务执行,即把查询任务分配给所有存储这个查询相关数据的数据节点。
5)Query Executor通过流式交换中间输出,并由Query Coordinator汇聚来自各个impalad的结果。
Coordinator把汇总后的结果返回给CLI客户端。
第2章 Impala的安装
2.1 Impala的地址
1.Impala的官网
http://impala.apache.org/
2.Impala文档查看
http://impala.apache.org/impala-docs.html
3.下载地址
http://impala.apache.org/downloads.html
2.2 Impala的安装方式
Impala有两种安装方式:
- 手动安装。
- CDH安装(推荐)。
下面我们使用Cloudera Manager安装Impala:
1)在主页中点击添加服务
2.3 Impala 的监护管理
可以通过下面的链接来访问Impala的监护管理页面:
1.查看StateStore
2.查看Catalog
http://hadoop102:25010/
2.4 Impala的初体验
1.启动Impala
[root@hadoop102 ~]# impala-shell
2.查看数据库
[hadoop102:21000] > show databases;
3.打开默认数据库
[hadoop102:21000] > use default;
4.显示数据库中的表
[hadoop102:21000] > show tables;
5.创建一张student表
[hadoop102:21000] > create table student(id int, name string)
> row format delimited
> fields terminated by '\t';
6.向表中导入数据
[hadoop103:21000] > load data inpath '/student.txt' into table student;
注意:
1) 关闭(修改hdfs的配置dfs.permissions为false)或修改hdfs的权限,否则impala没有写的权限
[hdfs@hadoop103 ~]$ hadoop fs -chmod 777 /
2) Impala不支持将本地文件导入到表中
7.查询
[hadoop103:21000] > select * from student;
8.退出impala
[hadoop103:21000] > quit;
第3章 Impala的shell命令
3.1 impala-shell的外部命令参数语法
不需要进入到impala-shell交互命令行当中即可执行的命令参数
impala-shell后面执行的时候可以带很多参数:
-h 查看帮助文档
impala-shell -h
-r 刷新整个元数据,数据量大的时候,比较消耗服务器性能
impala-shell -r
-B 去格式化,查询大量数据可以提高性能
--print_header 去格式化显示列名
--output_delimiter 指定分隔符
-v 查看对应版本
impala-shell -v -V
-f 执行查询文件
--query_file 指定查询文件
cd /export/servers
vim impala-shell.sql
use weblog;
select * from ods_click_pageviews limit 10;
通过-f 参数来执行查询文件
impala-shell -f impala-shell.sql
-i 连接到impalad
--impalad 指定impalad去执行任务
-o 保存执行结果到文件当中去
--output_file 指定输出文件名
impala-shell -f impala-shell.sql -o hello.txt
-p 显示查询计划
impala-shell -f impala-shell.sql -p
-q 不使用impala-shell进行查询
3.2 impala-shell的内部命令参数语法
进入impala-shell命令行之后可以执行的语法
help命令
帮助文档
connect命令
connect hostname 连接到某一台机器上面去执行
refresh 命令
refresh dbname.tablename 增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况
refresh mydb.stu;
invalidate metadata 命令:
invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新
explain 命令:
用于查看sql语句的执行计划
explain select * from stu;
explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息
set explain_level=3;
profile命令:
执行sql语句之后执行,可以打印出更加详细的执行步骤,
主要用于查询结果的查看,集群的调优等
select * from stu;
profile;
第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 创建数据库
1.创建命令
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
注:Impala不支持WITH DBPROPERTIE…语法
2. 错误演示
[hadoop103:21000] > create database db_hive
> WITH DBPROPERTIES('name' = 'ttt');
Query: create database db_hive
WITH DBPROPERTIES('name' = 'ttt')
ERROR: AnalysisException: Syntax error in line 2:
WITH DBPROPERTIES('name' = 'ttt')
^
Encountered: WITH
Expected: COMMENT, LOCATION
5.2查询数据库
5.2.1显示数据库
[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 | | |
+---------+----------+---------+
5.2.2删除数据库
[hadoop103:21000] > drop database hive_db;
[hadoop103:21000] > drop database hive_db cascade;
注:
Impala不支持alter database语法
当数据库被 USE 语句选中时,无法删除
5.3创建表
5.3.1 管理表
[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;
5.3.2 外部表
[hadoop103:21000] > create external table stu_external(
> id int,
> name string)
> row format delimited fields terminated by '\t' ;
5.4分区表
5.4.1 创建分区表
[hadoop103:21000] > create table stu_par(id int, name string)
> partitioned by (month string)
> row format delimited
> fields terminated by '\t';
5.4.2 向表中导入数据
[hadoop103:21000] > alter table stu_par add partition (month='201810');
[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201810');
[hadoop103:21000] > insert into table stu_par partition (month = '201811')
> select * from student;
注意:
如果分区没有,load data导入数据时,不能自动创建分区。
5.4.3 查询分区表中的数据
[hadoop103:21000] > select * from stu_par where month = '201811';
5.4.4 增加多个分区
[hadoop103:21000] > alter table stu_par add partition (month='201812') partition (month='201813');
5.4.5 删除分区
[hadoop103:21000] > alter table stu_par drop partition (month='201812');
5.4.5查看分区
[hadoop103:21000] > show partitions stu_par;
第6章 DML数据操作
6.1 数据导入(基本同hive类似)
注意:impala不支持load data local inpath…
6.2 数据的导出
1.impala不支持insert overwrite…语法导出数据
2.impala 数据导出一般使用 impala -o
[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt
[root@hadoop103 ~]# cat output.txt
1001 tignitgn
1002 yuanyuan
1003 haohao
1004 yunyun
Impala 不支持export和import命令
第7章 查询
1.基本的语法跟hive的查询语句大体一样
2.Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
3.Impala中不支持分桶表
4.Impala不支持COLLECT_SET(col)和explode(col)函数
5.Impala支持开窗函数
[hadoop103:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;
第8章 自定义函数
- 创建一个maven工程Hive
- maven依赖:
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.0</version>
</dependency>
3.创建一个类
import org.apache.hadoop.hive.ql.exec.UDF; import java.security.MessageDigest; public class MD5 extends UDF{ public static String evaluate(String value) { StringBuilder sb = new StringBuilder(); try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); byte[] bytes = messageDigest.digest(value.getBytes()); for (int i = 0; i < bytes.length; i++) { int tempInt = bytes[i] & 0xff; if (tempInt < 16) { sb.append(0); } sb.append(Integer.toHexString(tempInt)); } } catch (Exception e) { System.out.println(e.getMessage()); } return sb.toString(); } public static void main(String[] args) { String hello = "123456789"; System.out.println("MD5加密后的结果:" + evaluate(hello)); } }
4.达成jar包上传到服务器/opt/module/jars/hive_udf-0.0.1-SNAPSHOT.jar
5.将jar包上传到hdfs的指定目录
Hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /user/impala/user_function/
6.创建函数,impala-shell中执行,需要指定返回值(returns)
Create function md5(string) returns string location 'hdfs://nameservice/user/impala/user_function/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.business.bi.udf.MD5';
7.使用自定义函数
Show functions;
Select MD(name) from tbname;
第9章 压缩和存储
文件格式 |
压缩编码 |
Impala是否可直接创建 |
是否可直接插入 |
Parquet Parquet是面向分析型业务的列式存储格式 |
Snappy(默认), GZIP; |
Yes |
支持:CREATE TABLE, INSERT, 查询 |
Text |
LZO,gzip,bzip2,snappy |
Yes. 不指定 STORED AS 子句的 CREATE TABLE 语句,默认的文件格式就是未压缩文本 |
支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据 |
RCFile |
Snappy, GZIP, deflate, BZIP2 |
Yes. |
仅支持查询,在 Hive 中加载数据 |
SequenceFile |
Snappy, GZIP, deflate, BZIP2 |
Yes. |
仅支持查询,在 Hive 中加载数据 |
注:impala不支持ORC格式-RCFile
desc formated tablename;
创建parquet格式的表并插入数据进行查询
[bigdata13:21000] >
create table student3(id int, name string)
row format delimited
fields terminated by '\t'
stored as PARQUET;
[bigdata13:21000] > insert into table student3 values(1001,'zhangsan');
[bigdata13:21000] > select * from student3;
在Hive和Impala上查看会自动进行转换成可读形式
第10章 优化
1、尽量将StateStore和Catalog单独部署到同一个节点,保证他们正常通行。
2、通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率。
3、SQL优化,使用之前调用执行计划
4、选择合适的文件格式进行存储,提高查询效率。
5、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中)
6、使用合适的分区技术,根据分区粒度测算
7、使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala选择不同的连接顺序时,表中使用的查询。
[hadoop104:21000] > compute stats student;
Query: compute stats student
+-----------------------------------------+
| summary |
+-----------------------------------------+
| Updated 1 partition(s) and 2 column(s). |
+-----------------------------------------+
8、网络io的优化:
–a.避免把整个数据发送到客户端
–b.尽可能的做条件过滤
–c.使用limit字句
–d.输出文件时,避免使用美化输出
–e.尽量少用全量元数据的刷新
使用profile输出底层信息计划,在做相应环境优