impala 基础知识及使用

本文介绍Cloudera公司的Impala,一款高性能SQL查询引擎,适用于HDFS和HBase数据的交互式查询。涵盖Impala的基本概念、优缺点、架构、安装步骤、常用操作命令、数据类型、DDL与DML语句、查询技巧、自定义函数、存储与压缩、及优化策略等内容。

第1章 Impala的基本概念

1.1 什么是Impala

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

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

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

1.2 Impala的优缺点

1.2.1 优点

1)基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。

2)无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度,速度快。

3)使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。

4)支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。

5)可以访问hive的metastore,对hive数据直接做数据分析。

1.2.2 缺点

1)对内存的依赖大,且完全依赖于hive。

2)实践中,分区超过1万,性能严重下降。

3)只能读取文本文件,而不能直接读取自定义二进制文件。

4)每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。

1.3 Impala的架构

在这里插入图片描述
从上图可以看出,Impala自身包含三个模块:Impalad、Statestore(存放Hive的元数据)和Catalog(拉取真实数据),除此之外它还依赖Hive Metastore和HDFS。

1)impalad:

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

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

2)Catalog:

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

接收来自statestore的所有请求。

3)Statestore:

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

第2章 Impala的安装

2.1 impala的相关地址

1)Impala的官网

http://impala.apache.org/

2)Impala文档查看

http://impala.apache.org/impala-docs.html

3)下载地址

http://impala.apache.org/downloads.html

2.2 Impala的安装方式

Cloudera Manager(CDH首推)

下面我们使用Cloudera Manager安装Impala

1)在主页中点击添加服务
在这里插入图片描述
2)选择Impala服务
在这里插入图片描述
1、进行角色分配
在这里插入图片描述
注意:最好将StateStore和CataLog Sever单独部署在同一节点上。
2、配置Impala
在这里插入图片描述
3、启动Impala
在这里插入图片描述
4、安装成功
在这里插入图片描述

2.3 Impala 的监护管理

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

1)查看StateStore

http://hadoop102:25010/

2) 查看Catalog

http://hadoop102:25020/

2.4 Impala的初体验

1)启动Impala

[root@hadoop102 ~]# impala-shell

2)查看数据库

[hadoop102:21000] > show databases;

3)打开默认数据库

[hadoop102:21000] > use default;

4)显示数据库中的表

[hadoop102:21000] > show tables;

5.创建一张student表

[hadoop102:21000] > create table student(id int, name string)

                  > row format delimited

                  > fields terminated by '\t';

6.向表中导入数据

hadoop102:21000] > load data inpath '/student.txt' into table student;

注意:

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

[hdfs@hadoop102 ~]$ hadoop fs -chmod 777 /

2) Impala不支持将本地文件导入到表中

7.查询

[hadoop102:21000] > select * from student;

8.退出impala

[hadoop102:21000] > quit;

第3章 Impala的操作命令

3.1 Impala的外部shell

选项描述
centered 文本居中right-aligned 文本居右
-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打印列名

1)连接指定hadoop103的impala主机

[root@hadoop102 datas]# impala-shell -i hadoop103

2)使用-q查询表中数据,并将数据写入文件中

[hdfs@hadoop103 ~]$ impala-shell -q 'select * from student' -o output.txt

3)查询执行失败时继续执行

[hdfs@hadoop103 ~]$ vim impala.sql

select * from student;

select * from stu;

select * from student;

[hdfs@hadoop103 ~]$ impala-shell -f impala.sql

(加上-c 失败会继续执行)

[hdfs@hadoop103 ~]$ impala-shell -c -f impala.sql

4)在hive中创建表后,使用-r刷新元数据

hive> create table stu(id int, name string);

[hadoop103:21000] > show tables;

Query: show tables

+---------+

| name    |

+---------+

| student |

+---------+

[hdfs@hadoop103 ~]$ impala-shell -r

[hadoop103:21000] > show tables;

Query: show tables

+---------+

| name    |

+---------+

| stu     |

| student |

+---------+

5)显示查询执行计划

[hdfs@hadoop103 ~]$ impala-shell -p

[hadoop103:21000] > select * from student;

6)去格式化输出

[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[root@hadoop103 ~]# cat output.txt

1001    tignitgn

1002    yuanyuan

1003    haohao

1004    yunyun

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历史命令

1)查看执行计划

explain select * from student;

2)查询最近一次查询的底层信息

[hadoop103:21000] > select count(*) from student;

[hadoop103:21000] > profile;

3)查看hdfs及linux文件系统

[hadoop103:21000] > shell hadoop fs -ls /;

[hadoop103:21000] > shell ls -al ./;

4)刷新指定表的元数据

hive> load data local inpath '/opt/module/datas/student.txt' into table student;

[hadoop103:21000] > select * from student;

[hadoop103:21000] > refresh student;

[hadoop103:21000] > select * from student;

5)查看历史命令

[hadoop103:21000] > history;

第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 database_comment]

[LOCATION hdfs_path];

注意:Impala不支持WITH DBPROPERTIE…语法

[hadoop103:21000] > create database db_hive

                  > WITH DBPROPERTIES('name' = 'ttt');

Query: create database db_hive

WITH DBPROPERTIES('name' = 'ttt')

ERROR: AnalysisException: Syntax error in line 2:

WITH DBPROPERTIES('name' = 'ttt')

^

Encountered: WITH

Expected: COMMENT, LOCATION

5.2 查询数据库

5.2.1 显示数据库
[hadoop103:21000] > show databases;

[hadoop103:21000] > show databases like 'hive*';

Query: show databases like 'hive*'

+---------+---------+

| name    | comment |

+---------+---------+

| hive_db |         |

+---------+---------+
[hadoop103:21000] > desc database hive_db;

Query: describe database hive_db

+---------+----------+---------+

| name    | location | comment |

+---------+----------+---------+

| hive_db |          |         |

+---------+----------+---------+
5.2.2 删除数据库
[hadoop103:21000] > drop database hive_db;

[hadoop103:21000] > drop database hive_db cascade;

注:Impala不支持alter database语法,当数据库被 USE 语句选中时,无法删除======

5.3 创建表

5.3.1 管理表
[hadoop103:21000] > create table if not exists student2(

                  > id int, name string

                  > )

                  > row format delimited fields terminated by '\t'

                  > stored as textfile

                  > location '/user/hive/warehouse/student2';

[hadoop103:21000] > desc formatted student2;

5.3.2 外部表
[hadoop103:21000] > create external table stu_external(

                  > id int,

                  > name string)

                  > row format delimited fields terminated by '\t' ;

5.4 分区表

5.4.1 创建分区表
[hadoop103:21000] > create table stu_par(id int, name string)

                  > partitioned by (month string)

                  > row format delimited

                  > fields terminated by '\t';
5.4.2 向表中导入数据
[hadoop103:21000] > alter table stu_par add partition (month='201810');

[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201810');

[hadoop103:21000] > insert into table stu_par partition (month = '201811')

                  > select * from student;
注意:

如果分区没有,load data导入数据时,不能自动创建分区。
5.4.3 查询分区表中的数据
[hadoop103:21000] > select * from stu_par where month = '201811';
5.4.4 增加分区
1、增加单个分区
[hadoop103:21000] > alter table stu_par add partition (month='201812');
2、增加多个分区
[hadoop103:21000] > alter table stu_par add partition (month='201812') partition (month='201813');
5.4.5 删除分区
1、删除单个分区
[hadoop103:21000] >  alter table stu_par  drop if exists partition (month='201812');

2、删除多个分区
[hadoop103:21000] >  alter table stu_par  drop if exists partition (month='201812'),partition (month='201813');
5.4.5 查看分区
[hadoop103:21000] > show partitions stu_par;
5.4.6 添加表注释
[hadoop103:21000] >alter table stu_par  set TBLPROPERTIES ('comment' = '注释内容')
5.4.7 修改字段注释
[hadoop103:21000] >ALTER TABLE 表名  CHANGE 要更改的列名   更改后的列名  更改后的类型  COMMENT '注释'
5.4.8 修改表名
[hadoop103:21000] >ALTER TABLE [old_db_name.]old_table_name RENAME TO [new_db_name.]new_table_name
5.4.9 添加列
[hadoop103:21000] >ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
5.4.10 删除列
[hadoop103:21000] > ALTER TABLE name DROP [COLUMN] column_name
5.4.11 更改列的名称和类型
[hadoop103:21000] > ALTER TABLE name CHANGE column_name new_name new_type

第6章 DML数据操作

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

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

6.2 数据的导出

1)impala不支持insert overwrite…语法导出数据

2)impala 数据导出一般使用 impala -o

[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[root@hadoop103 ~]# cat output.txt

1001    tignitgn

1002    yuanyuan

1003    haohao

1004    yunyun

Impala 不支持exportimport命令

第7章 查询

基本的语法跟hive的查询语句大体一样
Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY
Impala中不支持分桶表
Impala不支持COLLECT_SET(col)和explode(col)函数
Impala支持开窗函数

[hadoop103:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

第8章 函数

8.1 自定义函数

1)创建一个Maven工程Hive

2)导入依赖

<dependencies>

<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->

<dependency>

<groupId>org.apache.hive</groupId>

<artifactId>hive-exec</artifactId>

<version>1.2.1</version>

</dependency>

</dependencies>

3)创建一个类

package com.atguigu.hive;

import org.apache.hadoop.hive.ql.exec.UDF;

 

public class Lower extends UDF {

 

public String evaluate (final String s) {

 

if (s == null) {

return null;

}

 

return s.toLowerCase();

}

}

4)打成jar包上传到服务器/opt/module/jars/udf.jar

5.)将jar包上传到hdfs的指定目录

hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /

6)创建函数

[hadoop103:21000] > create function mylower(string) returns string location '/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.atguigu.hive_udf.Hive_UDF';

7)使用自定义函数

[hadoop103:21000] > select ename, mylower(ename) from emp;

8)通过show functions查看自定义的函数

[hadoop103:21000] > show functions;

Query: show functions

+-------------+-----------------+-------------+---------------+

| return type | signature       | binary type | is persistent |

+-------------+-----------------+-------------+---------------+

| STRING      | mylower(STRING) | JAVA        | false         |

+-------------+-----------------+-------------+---------------+

第9章 存储和压缩

文件格式压缩编码Impala是否可直接创建是否可直接插入
ParquetSnappy(默认), GZIP;Yes支持:CREATE TABLE, INSERT, 查询
TextLZO,gzip,bzip2,snappyYes. 不指定 STORED AS 子句的 CREATE TABLE 语句,默认的文件格式就是未压缩文本支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据
RCFileSnappy, GZIP, deflate, BZIP2Yes.仅支持查询,在 Hive 中加载数据
SequenceFileSnappy, GZIP, deflate, BZIP2Yes.仅支持查询,在 Hive 中加载数据

注:impala不支持ORC格式

1)创建parquet格式的表并插入数据进行查询

[hadoop104:21000] > create table student2(id int, name string)

row format delimited

fields terminated by '\t'

stored as PARQUET;

[hadoop104:21000] > insert into table student2 values(1001,'zhangsan');

[hadoop104:21000] > select * from student2;

2)创建sequenceFile格式的表,插入数据时报错

[hadoop104: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.

第10章 优化

1、 尽量将StateStore和Catalog部署到同一个节点,保证他们正常通行。

2、 通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率。

3、 SQL优化,使用之前调用执行计划。

4、 选择合适的文件格式进行存储,提高查询效率。

5、 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中)

6、 使用合适的分区技术,根据分区粒度测算

7、 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala选择不同的连接顺序时,表中使用的查询。

[hadoop104:21000] > compute stats student;

Query: compute stats student

±----------------------------------------+

| summary |

±----------------------------------------+

| Updated 1 partition(s) and 2 column(s). |

±----------------------------------------+

8、 网络io的优化:

  a.尽可能的做条件过滤

  b.使用limit字句

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

d.尽量少用全量元数据的刷新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值