impala实战篇

1,182 阅读6分钟

第1章 impala基本概念

1 什么是impala

Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。

基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。

是CDH平台首选的PB级大数据实时查询分析引擎。

1.1 Impala的优缺点

1.1.1 优点

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

1.1.2 缺点

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

1.2 impala的架构

从上图可以看出,impala自身包含三个模块:impalad、statestore和catalog,除此之外它还依赖Hive Metastore和HDFS。

1)impalad:

接收client的请求、query执行并返回给中心协调节点;

子节点上的守护进程,负责向statestore保持通信,汇报工作。

2)catalog:

分发表的元数据信息到各个impalad中;

接收来自statestore的所有请求。

3)statestore:

负责收集分布在集群中各个impalad进程的资源信息、各节点健康状况,同步节点信息;

负责query的协调调度。

第2章 impala安装

2.1  impala的地址

1.impala的官网impala.apache.org/downloads.h…

2.impala文档查看impala.apache.org/impala-docs…

3.下载地址impala.apache.org/downloads.h…

2.2  impala的安装方式

cloudera manager(CDH首推)

手动安装

配置Impala 高可用

​现在的Impala 并不支持高可用,一旦我们连接的impalad 进程节点崩溃,就必须得手动换一个节点或者等待这个节点恢复正常。

暂时有个方法就是在Impala 外面在包一层 haproxy 代理 实现impala 的四层负载均衡,从而实现Impala HA。

官方文档连接:docs.cloudera.com/documentati…

2.3 impala监护管理

可以通过下面的链接来访问impala监护管理页面:

查看statestore:http://集群名(或者IP):25020/

查看catalog:http:// 集群名(或者IP):25010/

使用CDH安装在clound manager中可以看到,端口号不用记

2.4 impala初体验

向表中导入数据

load data inpath ‘文件所在路径’ into table 表名;

注意:

1) 关闭(修改hdfs的配置dfs.permissions为false)或修改hdfs的权限,否则impala没有写的权限

修改权限:hadoop fs –chmod –R 777 文件路径

2)impala不支持将本地文件导入到表中,可以把本地文件上传到HDFS

第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,--output_file filename保存所有查询结果到指定的文件。通常用于保存在命令行,使用-q选项执行单个查询时的查询结果。
-c查询执行失败时继续执行
-d default_db,--database=default_db指定启动后使用的数据库,与建立连接后使用use语句选择数据库作用相同,如果没有指定,那么使用default数据库
-r ,--refresh_after_connect建立连接后刷新impala元数据
-p,--show_profiles对shell中执行的每一个查询,显示其查询执行计划
-B,--delimited去格式化输出
--output_delimited=character指定分隔符
--print_header打印列名

3.2 impala的内部shell

选项描述
help显示帮助信息
explain显示执行计划
profile(查询完成后执行)查询最近一次查询的底层信息
shell不退出impala-shell执行shell命令
version显示版本信息(等同于impala-shell -v)
connect连接impalad主机,默认端口21000(等同于impala-shell -i)
refresh增量刷新元数据库
invalidate metadata全量刷新元数据库(慎用)(等同于impala-shell -r)
history历史命令

查看执行计划:explain select * from 表名;

查询最近一次查询的底层信息:select count(*) from 表名;

                            profile;

shell命令:

第4章 impala数据类型

Hive数据类型Impala数据类型长度
TINYINTTINYINT1byte有符号整数
SMALINTSMALINT2byte有符号整数
INTINT4byte有符号整数
BIGINTBIGINT8byte有符号整数
BOOLEANBOOLEAN布尔类型,true或者false
FLOATFLOAT单精度浮点数
DOUBLEDOUBLE双精度浮点数
STRINGSTRING字符系列。可以指定字符集。可以使用单引号或者双引号
TIMESTAMPTIMESTAMP时间类型
BINARY不支持字节数组

注意:impala虽然支持array,map,struct复杂数据类型,但是支持并不完全,一般处理方法,将复杂类型转化为基本类型,通过hive创建表

第5章 DDL数据定义

5.1创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT datebase_comment]

[LOCATION hdfs_path];

注:impala不支持with dbproperties…语法

5.2 查询数据库

5.2.1 显示数据库

show databases;

show databases like ‘rrs_*’;

show tables in apex_report like 'rrs_region*';

select current_database();

describe database apex_report;

注:_impala_builtins    --System database for Impala builtin functions(Impala内置函数的系统数据库)

知识点补充:(hive与impala内置函数区别)

查看内置的函数

hive不需要进入什么内置数据库, 即可使用show functions命令列出所有内置的函数.

show functions; -- hive仅显示函数的名称, 没有参数和返回值信息.

desc function function_name ; -- 该命令能显示函数的具体用途.

impala需要先进入_impala_builtins数据库,才能使用show functions命令列出所有内置的函数.

use _impala_builtins;

show functions;

impala 当中的元数据的同步的问题

impala当中创建的数据库表,不用刷新,直接就可以看得到

hive当中创建的数据库表,需要刷新元数据才能够看得到

因为impala的catalog的服务,我们需要通过刷新机制,将hive当中表的元数据信息,保存到catalog里面来,impala才能够看得到

5.2.2 删除数据库

drop database apex_report;  --只能删除空数据库(数据库中没有表)

drop database apex_report cascade;  --强制删除数据库不管是否空数据库

注:impala不支持alter database语法

当数据库被use语句选中时,无法删除

5.3 创建表

不支持分桶表。

5.3.1 管理表

create table if not exists student (id int,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘路径’;

desc formatted student;

5.3.2 外部表

create external table external_student (id int,name string) row format delimited fields terminated by ‘\t’ stored as textfile location ‘路径’;

5.4 分区表

5.4.1 创建分区表

create table student_partition (id int,name string) partitioned by (month string) row format deleimited fields terminated by ‘\t’;

5.4.2 向分区表导入数据:

(这里的路径是HDFS路径,不是本地路径)

1.load date inpath “/student.txt” into table student_partition partition (month=’10’);

使用此方法导入数据时,会报错,需要先添加分区,再导入数据,解决办法:

alter table student_partition add partition (month=’10’);

load date inpath “/student.txt” into table student_partition partition (month=’10’);

2.使用insert插入数据时,即创建分区又导入数据

insert into table student_partition partition (month=’11’) select * from student;

注意:如果分区没有,使用load data导入数据时,不能自动创建分区。

5.4.3 查询分区表数据

select * from student_partition where month = ‘10’;

5.4.4 增加多个分区

alter table student_partition add partition (month=’201911’) partition (month=’201910’);

5.4.5 删除分区

alter table student_partition drop partition (month=’201910’);

不支持删除多个分区,单次只能删除一个分区

5.4.6 查看分区

show partitions student_partition;

第6章 DML数据操作

6.1 数据的导入(基本同hive类似)

注意:impala不支持load data local inpath ……

6.2 数据导出

1.impala不支持insert overwrite ……语法导出

2.impala数据导出一般使用impala –o

impala-shell –q ‘slelect * from student;’ –B –output_delimiter=’\t’ –o output.txt

真实案例:impala-shell -q 'select * from apex_report.test_test' -i rrs-hdp-dn01:25003 -u root -l --auth_creds_ok_in_clear --ldap_password_cmd="echo -n 'Haier,123'" -B --output_delimiter=',' -o output.txt

cat output.txt

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支持开窗函数

select * from (select *,rank() over(partition by zxbm order by danjia desc) rank from apex_report.test_test) t1 where rank <= 3;

第8章 函数

自定义函数

hadoop fs –put /opt/test/hive.jar /

Create function mylower(string) returns string location ‘/hive.jar’ symbol=’类名全路径(包名+类名)’;

Select mylower(‘NAME’);

Show functions;

  1. 创建一个maven工程
  2. 导入依赖
  3. 创建一个类
  4. 打成jar包上传到服务器(一个路径,例如:/opt/test/hive.jar)
  5. 将jar包上传到hdfs地指定目录(例如根目录)
  6. 创建函数
  7. 使用自定义函数
  8. 通过show functions查看自定义的函数

第9章 存储和压缩

文件格式压缩编码Impala是否可直接创建是否可直接插入
ParquetSnappy(默认),GZIPYes支持: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格式

可以通过设置set COMPRESSION_CODEC = gzip;来更改压缩编码方式,如果想取消设置,使用:unset COMPRESSION_CODEC;即可还原压缩编码方式。

压缩编码方式是否设置成功,可以通过表的大小来确认。

第10章 优化

  1. 尽量将statestore和catalog单独部署到同一个节点,保证他们正常通行。
  2. 通过对impala daemon内存限制(默认256M)及statestore工作线程数,来提高impala的执行效率。
  3. SQL优化,使用之前调用执行计划
  4. 选择合适的文件格式进行存储,提高查询效率
  5. 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert ……select ……方式中间表的数据插入到最终表中)
  6. 使用合适的分区技术,根据分区粒度测算
  7. 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值得数量差异可能导致impala选择不同得连接顺序时进行查询。
  8. 使用profile输出底层信息计划,在做相应环境优化
  9. 网络io的优化

避免把整个数据发送到客户端

尽可能地做条件过滤

使用limit子句

输出文件时,避免使用美化输出

尽量少用全量元数据地刷新