Impala 入门

1 概述

1.1 什么是 Impala?

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

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

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

1.2 Impala 的优缺点

1.2.1 优点

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

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

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

  • 支持各种文件格式,如 TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet

  • 可以访问 Hive 的 metastore,对 Hive 数据直接做数据分析

image

1.2.2 缺点

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

1.3 Impala 的架构

[图片上传失败...(image-c7f979-1569985641812)]

1、Impalad

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

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

2、Catalog

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

接收来自 Statestore 的所有请求

3、Statestore

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

负责 Query 的协调调度

2 操作命令

2.1 外部 shell

选项 描述
-h --help 显示帮助信息
-v --version 显示版本信息
-i hostname --impalad=hostname 连接指定主机,默认端口为21000
-q query --query=query 从命令行中传递一个shell命令,执行完这一语句后shell会立即退出
-f query_file --query_file=query_file 传递一个sql查询文件,内容必须以分号分隔
-o filename --output_file filename 保存查询结果到文件中
-c 查询失败时继续执行
-d default_db --database=default_db 指定启动后连接的数据库
-r --refresh_after_connect 建立后刷新impala元数据
-p --show_profiles 对shell中执行的每一个查询,显示其查询执行计划
-B 去格式化输出
--output_delimiter=character 指定分隔符
--print_header 打印列名

连接 hadoop103 的impala 主机

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

使用 -q 查询表中数据,将结果输出到 output.txt

[root@hadoop102 ~]# impala-shell -q 'select * from student' -o output.txt

查询失败时继续执行

[root@hadoop102 ~]# vim impala.sql
select * from student;
select * from stu;
select * from student;
[root@hadoop102 ~]# impala-shell -c -f impala.sql;

在 hive 中创建表后,刷新元数据

hive> create table stu(id int, name string);
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name    |
+---------+
| student |
+---------+
[root@hadoop102 ~]# impala-shell -r
[hadoop103:21000] > show tables;
Query: show tables
+---------+
| name    |
+---------+
| stu     |
| student |
+---------+

显示查询执行计划

[root@hadoop102 ~]# impala-shell -p

去格式化输出

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

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

查看执行计划

explain select * from student;

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

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

查看 hdfs 和 linux 文件系统

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

刷新指定表的元数据

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;

3 数据类型

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 不支持 字节数组

4 DDL

4.1 创建数据库

语法:

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path];

注:Impala不支持WITH DBPROPERTIE…语法

4.2 查询数据库

显示数据库

[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 |          |         |
+---------+----------+---------+

删除数据库

[hadoop103:21000] > drop database hive_db;
[hadoop103:21000] > drop database hive_db cascade;

注:

Impala 不支持 alter database 语法

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

4.3 创建表

管理表

[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;

外部表

[hadoop103:21000] > create external table stu_external (id int, name string) 
                  > row format delimited fields terminated by '\t' ;

4.4 分区表

创建分区表

[hadoop103:21000] > create table stu_par(id int, name string)
                  > partitioned by (month string)
                  > row format delimited 
                  > fields terminated by '\t';

向表中导入数据

[hadoop103:21000] > alter table stu_par add partition (month='201910');
[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201910');
[hadoop103:21000] > insert into table stu_par partition (month = '201911') select * from student;

查询分区表中的数据

[hadoop103:21000] > select * from stu_par where month = '201911';

增加多个分区

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

删除分区

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

查看分区

[hadoop103:21000] > show partitions stu_par;

5 DML

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

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

5.2 数据的导出

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

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

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

Impala 不支持export和import命令

5.3 查询

基本的语法跟 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;

6 优化

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

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

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

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

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

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

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

[hadoop104:21000] > show table stats student;

Query: show table stats student

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

| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                          |

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

| -1    | 1      | 67B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://hadoop102:8020/user/hive/warehouse/student |

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

[hadoop104:21000] > compute stats student;

Query: compute stats student

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

| summary                                 |

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

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

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

[hadoop104:21000] > show table stats student;

Query: show table stats student

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

| #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                          |

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

| 6     | 1      | 67B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://hadoop102:8020/user/hive/warehouse/student |

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

8、网络io的优化:

​ –a.避免把整个数据发送到客户端

​ –b.尽可能的做条件过滤

​ –c.使用limit字句

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容