1章 Impala的基本概念

1.1 什么是Impala

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

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

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

1.2 Impala优缺点

 

1.3 Impala组成

 

 

 

 

1.4 Impala运行原理

 

从上图可以看出,Impala自身包含三个模块:Impaladimpala  daemon),StatestoreCatalog,除此之外,他还依赖Hive MetastoreHDFS

Impalad:接收client的请求、query执行并返回给中心协调节点;子节点上的守护进程,负责向statestore保持通信,汇报工作。

Catalog:分发表的元数据信息到各个impalad中;接收来自statestore的所有请求。

Statestore:负责收集分布在集群中各个impala进程的资源信息、各个节点健康状态,同步节点信息;负责query的协调调度。

 

Impala执行查询的具体过程:

1)当用户提交查询前,Impala先创建一个负责协调客户端提交的查询的Impalad进程,该进程会向Impala State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息。

2)用户通过CLI客户端提交一个查询到impalad进程,ImpaladQuery PlannerSQL语句进行解析,生成解析树;然后,Planner把这个查询的解析树变成若干PlanFragment,发送到Query Coordinator.

3Coordinator通过从元数据库中获取元数据,从HDFS的名称节点中获取数据地址,以得到存储这个查询相关数据的所有数据节点。

4Coordinator初始化相应impalad上的任务执行,即把查询任务分配给所有存储这个查询相关数据的数据节点。

5Query Executor通过流式交换中间输出,并由Query Coordinator汇聚来自各个impalad的结果。

Coordinator把汇总后的结果返回给CLI客户端。

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的安装方式

Impala有两种安装方式:

  1. 手动安装。
  2. CDH安装(推荐)。

下面我们使用Cloudera Manager安装Impala

1)在主页中点击添加服务

 

 

 

 

 

2.3 Impala 的监护管理

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

1.查看StateStore

    http://hadoop102:25020/

2.查看Catalog

    http://hadoop102:25010/

 

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.向表中导入数据

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

注意:

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

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

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

7.查询

[hadoop103:21000] > select * from student;

8.退出impala

[hadoop103:21000] > quit;

3章 Impala的shell命令

3.1 impala-shell的外部命令参数语法

不需要进入到impala-shell交互命令行当中即可执行的命令参数

 

impala-shell后面执行的时候可以带很多参数:

 

-h  查看帮助文档

impala-shell -h

 

-r  刷新整个元数据,数据量大的时候,比较消耗服务器性能

impala-shell -r

 

-B  去格式化,查询大量数据可以提高性能

   --print_header  去格式化显示列名

   --output_delimiter  指定分隔符

 

-v  查看对应版本

impala-shell -v -V

 

-f  执行查询文件

--query_file   指定查询文件

cd /export/servers

vim impala-shell.sql

use weblog;

select * from ods_click_pageviews limit 10;

通过-f 参数来执行查询文件

impala-shell -f impala-shell.sql

 

-i  连接到impalad

--impalad  指定impalad去执行任务

 

-o  保存执行结果到文件当中去

--output_file  指定输出文件名

impala-shell -f impala-shell.sql -o hello.txt

 

-p  显示查询计划

impala-shell -f impala-shell.sql -p

 

-q 不使用impala-shell进行查询

 

3.2 impala-shell的内部命令参数语法

进入impala-shell命令行之后可以执行的语法

 

help命令

帮助文档

 

connect命令

connect  hostname 连接到某一台机器上面去执行

 

refresh 命令

refresh dbname.tablename  增量刷新,刷新某一张表的元数据,主要用于刷新hive当中数据表里面的数据改变的情况

refresh mydb.stu;

 

invalidate  metadata 命令:

invalidate  metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新

 

explain 命令:

用于查看sql语句的执行计划

explain select * from stu;

 

explain的值可以设置成0,1,2,3等几个值,其中3级别是最高的,可以打印出最全的信息

 

set explain_level=3;

 

profile命令:

执行sql语句之后执行,可以打印出更加详细的执行步骤,

主要用于查询结果的查看,集群的调优等

select * from stu;

profile;

第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创建表。

 

5章 DDL数据定义

5.1 创建数据库

1.创建命令

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path];

注:Impala不支持WITH DBPROPERTIE…语法

 

2. 错误演示

[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 增加多个分区

[hadoop103:21000] > alter table stu_par add partition (month='201812') partition (month='201813');

5.4.5 删除分区

[hadoop103:21000] >  alter table stu_par drop partition (month='201812');

5.4.5查看分区

[hadoop103:21000] > show partitions stu_par;

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章 查询

1.基本的语法跟hive的查询语句大体一样

2.Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY

3.Impala中不支持分桶表

4.Impala不支持COLLECT_SET(col)explodecol)函数

5.Impala支持开窗函数

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

第8章 自定义函数

  1. 创建一个maven工程Hive
  2. maven依赖:

        <dependency>

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

            <artifactId>hive-exec</artifactId>

            <version>1.2.0</version>

        </dependency>

  3.创建一个类

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

import java.security.MessageDigest;

 

public class MD5 extends UDF{

    public static String evaluate(String value) {

        StringBuilder sb = new StringBuilder();

        try {

            MessageDigest messageDigest = MessageDigest.getInstance("MD5");

            byte[] bytes = messageDigest.digest(value.getBytes());

            for (int i = 0; i < bytes.length; i++) {

                int tempInt = bytes[i] & 0xff;

                if (tempInt < 16) {

                    sb.append(0);

                }

                sb.append(Integer.toHexString(tempInt));

            }

        }

        catch (Exception e) {

            System.out.println(e.getMessage());

        }

        return sb.toString();

    }

 

    public static void main(String[] args) {

        String hello = "123456789";

        System.out.println("MD5加密后的结果:" + evaluate(hello));

    }

}

 

  4.达成jar包上传到服务器/opt/module/jars/hive_udf-0.0.1-SNAPSHOT.jar

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

Hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar   /user/impala/user_function/

  6.创建函数,impala-shell中执行,需要指定返回值(returns

Create function md5(string) returns string location 'hdfs://nameservice/user/impala/user_function/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.business.bi.udf.MD5';

  7.使用自定义函数

Show functions;

Select  MD(name)  from tbname;

第9章 压缩和存储

文件格式

压缩编码

Impala是否可直接创建

是否可直接插入

Parquet

Parquet是面向分析型业务的列式存储格式

Snappy(默认), GZIP;

Yes

支持:CREATE TABLE, INSERT, 查询

Text

LZOgzipbzip2snappy

Yes. 不指定 STORED AS 子句的 CREATE TABLE 语句,默认的文件格式就是未压缩文本

支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据

RCFile

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据

SequenceFile

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据

注:impala不支持ORC格式-RCFile

desc formated tablename;

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

[bigdata13:21000] >

create table student3(id int, name string)

row format delimited

fields terminated by '\t'

stored as PARQUET;

 

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

[bigdata13:21000] > select * from student3;

HiveImpala上查看会自动进行转换成可读形式

10章 优化

1、尽量将StateStoreCatalog单独部署到同一个节点,保证他们正常通行。

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

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

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

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

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.尽可能的做条件过滤

c.使用limit字句

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

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

使用profile输出底层信息计划,在做相应环境优

 

posted on 2020-06-04 09:21  大羽治不了水  阅读(1041)  评论(0编辑  收藏  举报