impala实战篇

第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实战篇_第1张图片

从上图可以看出,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

2.impala文档查看Impala

3.下载地址Impala

2.2  impala的安装方式

>cloudera manager(CDH首推)

>手动安装

>配置Impala 高可用

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

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

官方文档连接:Using Impala through a Proxy for High Availability | 6.3.x | Cloudera Documentation

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命令:

impala实战篇_第2张图片

impala实战篇_第3张图片

第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创建数据库

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实战篇_第4张图片

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;

impala实战篇_第5张图片

第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. impala实战篇_第6张图片
  4. 创建一个类
  5. impala实战篇_第7张图片
  6. 打成jar包上传到服务器(一个路径,例如:/opt/test/hive.jar)
  7. 将jar包上传到hdfs地指定目录(例如根目录)
  8. 创建函数
  9. 使用自定义函数
  10. 通过show functions查看自定义的函数

第9章 存储和压缩

文件格式

压缩编码

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格式

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

impala实战篇_第8张图片

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

第10章 优化

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

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

尽可能地做条件过滤

使用limit子句

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

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

你可能感兴趣的:(Impala,impala)