文章目录
一、CDH的介绍
Cloudera
版本(Cloudera’s Distribution Including Apache Hadoop
,简称CDH
),基于Web
的用户界面,支持大多数Hadoop
组件,包括HDFS
、MapReduce
、Hive
、Pig
、 HBase
、Zookeeper
、Sqoop
,简化了大数据平台的安装、使用难度。
Cloudera Manager
的功能:
- 管理:对集群进行管理,如添加、删除节点等操作。
- 监控:监控集群的健康情况,对设置的各种指标和系统运行情况进行全面监控。
- 诊断:对集群出现的问题进行诊断,对出现的问题给出建议解决方案。
- 集成:多组件进行整合。
Cloudera Manager
的架构:
Server
:负责软件安装、配置,启动和停止服务,管理服务运行的群集。Agent
:安装在每台主机上。负责启动和停止的过程,配置,监控主机。Management Service
:由一组执行各种监控,警报和报告功能角色的服务。Database
:存储配置和监视信息。Cloudera Repository
:软件由Cloudera
管理分布存储库。(类似Maven
的中心仓库)Clients
:是用于与服务器进行交互的接口(API
和Admin Console
)
集群添加服务:
查看主机状况:
虽然状态全红,但是内存、CPU
的状态都较好,并不影响服务的使用。
二、Impala概念
2.1 什么是Impala
Cloudera
公司推出,提供对HDFS
、HBase
数据的高性能、低延迟的交互式SQL
查询功能。基于Hive
,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。是CDH
平台首选的PB
级大数据实时查询分析引擎。
2.2 Impala的优缺点
优点:
- 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的
I/O
开销 - 无需转换为
MapReduce
,直接访问存储在HDFS
,HBase
中的数据进行作业调度,速度快 - 使用了支持
Data locality
的I/O
调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销 - 支持各种文件格式,如
TEXTFILE
、SEQUENCEFILE
、RCFile
、Parquet
- 可以访问
Hive
的metastore
,对Hive
数据直接做数据分析
缺点:
- 对内存的依赖大,且完全依赖于
Hive
- 实践中,分区超过1万,性能严重下降
- 只能读取文本文件,而不能直接读取自定义二进制文件
- 每当新的记录/文件被添加到
HDFS
中的数据目录时,该表需要被刷新
2.3 Impala的架构
从上图可以看出,Impala
自身包含三个模块:Impalad
、Statestore
和Catalog
,除此之外它还依赖Hive Metastore
和HDFS
。
Impalad
:接收client
的请求、Query
执行并返回给中心协调节点;子节点上的守护进程,负责向Statestore
保持通信,汇报工作。
Catalog
:分发表的元数据信息到各个impalad
中,接收来自Statestore
的所有请求。
Statestore
:负责收集分布在集群中各个impalad
进程的资源信息、各节点健康状况,同步节点信息;负责query
的协调调度。
2.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
创建表。
三、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 | 打印列名 |
①连接指定hadoop101
的impala
主机
[root@hadoop100 datas]# impala-shell -i hadoop101
②使用-q
查询表中数据,并将数据写入文件中
[root@hadoop100 datas]# impala-shell -q 'select * from student' -o output.txt
③查询执行失败时继续执行
[root@hadoop100 datas]# vim impala.sql
select * from student;
select * from stu;
select * from student;
[root@hadoop100 datas]# impala-shell -f impala.sql;
[root@hadoop100 datas]# impala-shell -c -f impala.sql;
④在Hive
中创建表后,使用-r
刷新元数据
hive> create table stu(id int, name string);
[hadoop100:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| student |
+---------+
[root@hadoop100 ~]$ impala-shell -r
[hadoop100:21000] > show tables;
Query: show tables
+---------+
| name |
+---------+
| stu |
| student |
+---------+
⑤显示查询执行计划
[root@hadoop100 datas]# impala-shell -p
[hadoop100:21000] > select * from student;
⑥去格式化输出
[root@hadoop100 ~]# impala-shell -q 'select * from student' \
-B --output_delimiter="\t" -o output.txt
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 |
历史命令 |
①查看执行计划
[hadoop100:21000] > explain select * from student;
②查询最近一次查询的底层信息
[hadoop100:21000] > select count(*) from student;
[hadoop100:21000] > profile;
③查看HDFS
及Linux
文件系统
[hadoop100:21000] > shell hadoop fs -ls /;
[hadoop100:21000] > shell ls -al ./;
④刷新指定表的元数据
hive> load data local inpath '/opt/module/datas/student.txt' into table student;
[hadoop100:21000] > select * from student;
[hadoop100:21000] > refresh student;
[hadoop100:21000] > select * from student;
⑤查看历史命令
[hadoop100:21000] > history;
四、DDL数据定义
4.1 数据库操作
创建数据库:
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];
显示数据库:
[hadoop100:21000] > show databases like 'hive*';
Query: show databases like 'hive*'
+---------+---------+
| name | comment |
+---------+---------+
| hive_db | |
+---------+---------+
[hadoop100:21000] > desc database hive_db;
Query: describe database hive_db
+---------+----------+---------+
| name | location | comment |
+---------+----------+---------+
| hive_db | | |
+---------+----------+---------+
删除数据库:
[hadoop103:21000] > drop database hive_db;
[hadoop103:21000] > drop database hive_db cascade;
- 加
cascade
删除非空数据库; Impala
不支持alter database
语法;- 当数据库被
use
语句选中时,无法删除。
4.2 表操作
创建表:
[hadoop100:21000] > create external table stu_external(id int, name string)
> row format delimited fields terminated by '\t' ;
Impala
表的创建类似Hive
,可以参考Hive
表的创建(https://hucheng.blog.csdn.net/article/details/106673984
)
创建分区表:
[hadoop100:21000] > create table stu_par(id int, name string)
> partitioned by (month string)
> row format delimited fields terminated by '\t';
向分区表中导入数据:
[hadoop100:21000] > alter table stu_par add partition (month='201810');
[hadoop100:21000] > load data inpath '/student.txt' into table stu_par \
partition(month='201810');
注意:如果分区没有,load data
导入数据时,不能自动创建分区。
查询分区表中的数据:
[hadoop100:21000] > select * from stu_par where month = '201810';
增加多个分区:
[hadoop103:21000] > alter table stu_par add partition (month='201812') \
partition (month='201813');
删除分区:
[hadoop103:21000] > alter table stu_par drop partition (month='201812');
查看分区:
[hadoop103:21000] > show partitions stu_par;
五、DML数据操作
数据导入(基本同hive类似)
注意:Impala
不支持load data local inpath…
,支持从HDFS
中导入
数据的导出
Impala
不支持insert overwrite…
语法导出数据Impala
数据导出一般使用impala -o
[root@hadoop100 ~]# impala-shell -q 'select * from student' \
-B --output_delimiter="\t" -o output.txt
Impala
不支持export
和import
命令
六、查询
- 基本的语法跟
Hive
的查询语句大体一样 Impala
不支持CLUSTER BY
,DISTRIBUTE BY
,SORT BY
Impala
中不支持分桶表Impala
不支持COLLECT_SET(col)
和explode(col)
函数Impala
支持开窗函数
[hadoop100:21000] > select name,orderdate,cost,sum(cost) over(partition by \
month(orderdate)) from business;
七、存储和压缩
文件格式 | 压缩编码 | 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
格式
创建Parquet
格式的表并插入数据进行查询
[hadoop100:21000] > create table student2(id int, name string)
> row format delimited
> fields terminated by '\t'
> stored as PARQUET;
[hadoop100:21000] > insert into table student2 values(1001,'zhangsan');
[hadoop100:21000] > select * from student2;
创建SequenceFile
格式的表,插入数据时报错
[hadoop100:21000] > create table student3(id int, name string)
> row format delimited
> fields terminated by '\t'
> stored as sequenceFile;
[hadoop100: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.
[hadoop100:21000] > set ALLOW_UNSUPPORTED_FORMATS=true;
[hadoop100:21000] > insert into table student3 values(1001,'zhangsan');
八、优化
- 尽量将
StateStore
和Catalog
单独部署到同一个节点,保证它们正常通信; - 通过对
Impala Daemon
内存限制(默认256M
)及StateStore
工作线程数,来提高Impala
的执行效率; SQL
优化,使用之前调用执行计划;- 选择合适的文件格式进行存储,提高查询效率;
- 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过
insert…select…
方式中间表的数据插入到最终表中); - 使用合适的分区技术;
- 使用
compute stats
进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala
选择不同的连接顺序时进行查询。
[hadoop100:21000] > show table stats student;
- 使用
profile
输出底层信息计划,在做相应环境优化; - 网络
io
的优化:① 避免把整个数据发送到客户端 ② 尽可能的做条件过滤 ③ 使用limit
字句 ④ 输出文件时,避免使用美化输出 ⑤ 尽量少用全量元数据的刷新