第1章 Impala的基本概念
1.1 什么是Impala
Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低提早的交互式SQL查问性能。
基于Hive,应用内存计算,兼顾数据仓库、具备实时、批处理、多并发等长处。
是CDH平台首选的PB级大数据实时查问剖析引擎。
1.2 Impala的优缺点
1.3 Impala的组成
1.4 Impala的运行原理
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的后果。
6) Coordinator把汇总后的后果返回给CLI客户端。
第2章 Impala的装置
2.1 Impala的地址
- Impala的官网
http://impala.apache.org/
- Impala文档查看
http://impala.apache.org/impala-docs.html
- 下载地址
http://impala.apache.org/downloads.html
2.2 Impala的装置形式
Impala有两种装置形式:
- 手动装置。
- CDH装置(举荐)。
上面咱们应用Cloudera Manager装置Impala:
1)在主页中点击增加服务
2)抉择Impala服务
3)进行角色调配
留神:最好将StateStore和CataLog Sever独自部署在同一节点上。
4)配置Impala
5)启动Impala
6)装置胜利
2.3 Impala 的监护治理
能够通过上面的链接来拜访Impala的监护治理页面:
1.查看StateStore
http://hadoop102:25020/
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 delimitedfields 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的操作命令
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 中执行的每一个查问,显示其查问执行打算
-B(--delimited)
去格式化输入
--output_delimiter=character
指定分隔符
--print_header
打印列名
- 连贯指定hadoop103的impala主机
[root@hadoop102 datas]# impala-shell -i hadoop103
- 应用-q查问表中数据,并将数据写入文件中
[hdfs@hadoop103 ~]$ impala-shell -q 'select * from student' -o output.txt
- 查问执行失败时继续执行
[hdfs@hadoop103 ~]$ vim impala.sql
select * from student;
select * from stu;
select * from student;
[hdfs@hadoop103 ~]$ impala-shell -f impala.sql;
[hdfs@hadoop103 ~]$ impala-shell -c -f impala.sql;
- 在hive中创立表后,应用-r刷新元数据
hive> create table stu(id int, name string);
[hadoop103:21000] > show tables;
Query: show tables
| name |
| student |
[hdfs@hadoop103 ~]$ impala-shell -r
[hadoop103:21000] > show tables;
Query: show tables
| name |
| stu |
| student |
- 显示查问执行打算
[hdfs@hadoop103 ~]$ impala-shell -p
[hadoop103:21000] > select * from student;
所谓执行打算,即在查问sql执行之前,先对该sql做一个剖析,列出须要实现这一项查问的具体计划:
- 去格式化输入
[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
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 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;
- 查看历史命令
[hadoop103:21000] > history;
第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…语法
- 谬误演示
[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章 查问
- 根本的语法跟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;
第8章 函数
8.1 自定义函数
1.创立一个Maven工程Hive
2.导入依赖
<dependencies>
<!-- https://mvnrepository.com/art... -->
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
3.创立一个类
package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String evaluate (final String s) {
if (s == null) {
return null;
}
return s.toLowerCase();
}
}
4.打成jar包上传到服务器/opt/module/jars/udf.jar
- 将jar包上传到hdfs的指定目录
hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /
- 创立函数
[hadoop103:21000] > create function mylower(string) returns string location '/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.atguigu.hive_udf.Hive_UDF';
- 应用自定义函数
[hadoop103:21000] > select ename, mylower(ename) from emp;
8.通过show functions查看自定义的函数
[hadoop103:21000] > show functions;
Query: show functions
| return type | signature | binary type | is persistent |
| STRING | mylower(STRING) | JAVA | false |
第9章 存储和压缩
文件格式
压缩编码
Impala是否可间接创立
是否可直接插入
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格局
1.创立parquet格局的表并插入数据进行查问
[hadoop104:21000] > create table student2(id int, name string)
row format delimitedfields terminated by 't'
stored as PARQUET;
[hadoop104:21000] > insert into table student2 values(1001,'zhangsan');
[hadoop104:21000] > select * from student2;
2.创立sequenceFile格局的表,插入数据时报错
[hadoop104:21000] > insert into table student3 values(1001,'zhangsan');
Query: insert into table student3 values(1001,'zhangsan')
Query submitted at: 2018-10-25 20:59:31 (Coordinator: http://hadoop104:25000)
Query progress can be monitored at: http://hadoop104:25000/query_plan?query_id=da4c59eb23481bdc:26f012ca00000000
WARNINGS: Writing to table format SEQUENCE_FILE is not supported. Use query option ALLOW_UNSUPPORTED_FORMATS to override.
第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.尽量少用全量元数据的刷新
9、 应用profile输入底层信息打算,在做相应环境优化