大数据平台CDH和Impala的使用

一、CDH的介绍

Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称CDH),基于Web的用户界面,支持大多数Hadoop组件,包括HDFSMapReduceHivePigHBaseZookeeperSqoop,简化了大数据平台的安装、使用难度。

Cloudera Manager的功能:

  • 管理:对集群进行管理,如添加、删除节点等操作。
  • 监控:监控集群的健康情况,对设置的各种指标和系统运行情况进行全面监控。
  • 诊断:对集群出现的问题进行诊断,对出现的问题给出建议解决方案。
  • 集成:多组件进行整合。

在这里插入图片描述
Cloudera Manager的架构:
在这里插入图片描述

  • Server:负责软件安装、配置,启动和停止服务,管理服务运行的群集。
  • Agent:安装在每台主机上。负责启动和停止的过程,配置,监控主机。
  • Management Service:由一组执行各种监控,警报和报告功能角色的服务。
  • Database:存储配置和监视信息。
  • Cloudera Repository:软件由Cloudera管理分布存储库。(类似Maven的中心仓库)
  • Clients:是用于与服务器进行交互的接口(APIAdmin Console

集群添加服务:
在这里插入图片描述
查看主机状况:

虽然状态全红,但是内存、CPU的状态都较好,并不影响服务的使用。
在这里插入图片描述

二、Impala概念

2.1 什么是Impala

Cloudera公司推出,提供对HDFSHBase数据的高性能、低延迟的交互式SQL查询功能。基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。是CDH平台首选的PB级大数据实时查询分析引擎。
在这里插入图片描述

2.2 Impala的优缺点

优点:

  1. 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销
  2. 无需转换为MapReduce,直接访问存储在HDFSHBase中的数据进行作业调度,速度快
  3. 使用了支持Data localityI/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销
  4. 支持各种文件格式,如TEXTFILESEQUENCEFILERCFileParquet
  5. 可以访问Hivemetastore,对Hive数据直接做数据分析

缺点:

  1. 对内存的依赖大,且完全依赖于Hive
  2. 实践中,分区超过1万,性能严重下降
  3. 只能读取文本文件,而不能直接读取自定义二进制文件
  4. 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新

2.3 Impala的架构

在这里插入图片描述
从上图可以看出,Impala自身包含三个模块:ImpaladStatestoreCatalog,除此之外它还依赖Hive MetastoreHDFS

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虽然支持ArrayMapStruct复杂数据类型,但是支持并不完全,一般处理方法,将复杂类型转化为基本类型,通过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 打印列名

①连接指定hadoop101impala主机

[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;

③查看HDFSLinux文件系统

[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不支持exportimport命令

六、查询

  1. 基本的语法跟Hive的查询语句大体一样
  2. Impala不支持CLUSTER BYDISTRIBUTE BYSORT BY
  3. Impala中不支持分桶表
  4. Impala不支持COLLECT_SET(col)explode(col)函数
  5. 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');

八、优化

  1. 尽量将StateStoreCatalog单独部署到同一个节点,保证它们正常通信;
  2. 通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率;
  3. SQL优化,使用之前调用执行计划;
  4. 选择合适的文件格式进行存储,提高查询效率;
  5. 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中);
  6. 使用合适的分区技术;
  7. 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala选择不同的连接顺序时进行查询。
[hadoop100:21000] > show table stats student;
  1. 使用profile输出底层信息计划,在做相应环境优化;
  2. 网络io的优化:① 避免把整个数据发送到客户端 ② 尽可能的做条件过滤 ③ 使用limit字句 ④ 输出文件时,避免使用美化输出 ⑤ 尽量少用全量元数据的刷新

猜你喜欢

转载自blog.csdn.net/qq_38697437/article/details/107044551
今日推荐