大数据平台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数据类型长度
TINYINTTINYINT1byte有符号整数
SMALINTSMALINT2byte有符号整数
INTINT4byte有符号整数
BIGINTBIGINT8byte有符号整数
BOOLEANBOOLEAN布尔类型,true或者false
FLOATFLOAT单精度浮点数
DOUBLEDOUBLE双精度浮点数
STRINGSTRING字符系列。可以指定字符集。可以使用单引号或者双引号。
TIMESTAMPTIMESTAMP时间类型
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是否可直接创建是否可直接插入
ParquetSnappy(默认), GZIP;Yes支持:CREATE TABLE, INSERT, 查询
TextFileLZO,gzip,bzip2,snappyYes. 不指定 STORED AS 子句的 CREATE TABLE 语句,默认的文件格式就是未压缩文本支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据
RCFileSnappy, GZIP, deflate, BZIP2Yes.支持CREATE,查询,在 Hive 中加载数据
SequenceFileSnappy, GZIP, deflate, BZIP2Yes.支持: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字句 ④ 输出文件时,避免使用美化输出 ⑤ 尽量少用全量元数据的刷新
相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页