Impala

mac2025-07-15  3

一、Impala的基本概念

1.1 什么是Impala Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。 基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。 是CDH平台首选的PB级大数据实时查询分析引擎。

 

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

 

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

1.3 Impala的架构

 

从上图可以看出,Impala自身包含三个模块:Impalad、Statestore和Catalog,除此之外它还依赖Hive Metastore和HDFS。

Impalad:

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

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

Catalog:

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

接收来自statestore的所有请求。

Statestore:

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

负责query的协调调度。

二、Impala的安装

2.1 Impala 的地址

Impala的官网

http://impala.apache.org/

Impala文档查看

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

下载地址

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

2.2 Impala****的安装方式

Cloudera Manager(CDH首推)手动安装

下面我们使用Cloudera Manager安装Impala

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

 

2.选择Impala服务

 

3、进行角色分配

 

4、注意:最好将StateStore和CataLog Sever单独部署在同一节点上。

5.配置Impala

 

6.启动Impala

 

7.安装成功

 

2.3 Impala 的监护管理

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

• 查看StateStore

http://bigdata11:25020/

• 查看Catalog

http://bigdata11:25010/

2.4 Impala****的初体验

1.启动Impala

[root@bigdata11 ~]# impala-shell

2.查看数据库

[bigdata11:21000] > show databases;

3.打开默认数据库

[bigdata11:21000] > use default;

4.显示数据库中的表

[bigdata11:21000] > show tables;

创建一张student表

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

6.向表中导入数据

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

注意:

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

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

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

会发生错误:load local data inpath '/opt/student.txt' into table student;

7.查询

[bigdata12:21000] > select * from student;

8.退出impala

[bigdata12:21000] > quit;

三、Impala的操作命令

3.1 Impala 的外部 shell

 

连接指定bigdata12的impala主机 [root@bigdata11 datas]# impala-shell -i bigdata12 使用-q查询表中数据,并将数据写入文件中 [hdfs@bigdata12 ~]

[hdfs@bigdata12 ~] vim impala.sql select * from student; select * from stu; select * from student; [hdfs@bigdata12 ~]

[hdfs@bigdata12 ~]  impala-shell -c -f impala.sql; 在hive中创建表后,使用-r刷新元数据 hive> create table stu(id int, name string); [bigdata12:21000] > show tables; Query: show tables +---------+ | name | +---------+ | student | +---------+ [hdfs@bigdata12 ~] impala-shell -r

[bigdata12:21000] > show tables;

显示查询计划:

[bigdata12:21000] impala-shell -p [bigdata12:21000] > select * from student; 去格式化输出 [root@bigdata12 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt 注:output.txt 是相对于Linux本地的相对路径,并且是以覆盖的方式写入到此文件中

[root@bigdata12 ~]# cat output.txt 1001 tignitgn 1002 yuanyuan 1003 haohao 1004 yunyun

3.2 Impala的内部shell

 

查看执行计划 explain select * from student; 查询最近一次查询的底层信息 [bigdata12:21000] > select count(*) from student; [bigdata12:21000] > profile; 查看hdfs及linux文件系统 [bigdata12:21000] > shell hadoop fs -ls /; [bigdata12:21000] > shell ls -al ./; 刷新指定表的元数据 hive> load data local inpath '/opt/module/datas/student.txt' into table student; [bigdata12:21000] > select * from student; [bigdata12:21000] > refresh student; [bigdata12:21000] > select * from student; 查看历史命令 [bigdata12:21000] > history;

四、Impala的数据类型

 

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

五、DDL数据定义

5.1 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path]; 注:Impala不支持WITH DBPROPERTIE…语法,但是在Hive中可以 [bigdata12:21000] > create database db_hive WITH DBPROPERTIES('name' = 'Andy'); 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显示数据库 [bigdata12:21000] > show databases; [bigdata12:21000] > show databases like 'hive'; Query: show databases like 'hive' +---------+---------+ | name | comment | +---------+---------+ | hive_db | | +---------+---------+ [bigdata12:21000] > desc database hive_db; Query: describe database hive_db +---------+----------+---------+ | name | location | comment | +---------+----------+---------+ | hive_db | | | +---------+----------+---------+

5.2.2删除数据库 [bigdata12:21000] > drop database hive_db; [bigdata12:21000] > drop database hive_db cascade; 注: Impala不支持alter database语法 当数据库被 USE 语句选中时,无法删除 5.3创建表 5.3.1 管理表 [bigdata12: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'; [bigdata12:21000] > desc formatted student2; 5.3.2 外部表 [bigdata12:21000] >

create external table stu_external( id int, name string) row format delimited fields terminated by '\t' ;

5.4分区表 5.4.1 创建分区表 [bigdata12:21000] >

create table stu_par(id int, name string) partitioned by (month string) row format delimited fields terminated by '\t'; 5.4.2 向表中导入数据 [bigdata12:21000] > alter table stu_par add partition (month='201810'); [bigdata12:21000] > load data inpath '/student.txt' into table stu_par partition(month='201910'); [bigdata12:21000] > insert into table stu_par partition (month = '201811') select * from student; 注意: 如果分区没有,load data导入数据时,不能自动创建分区。 5.4.3 查询分区表中的数据 [bigdata12:21000] > select * from stu_par where month = '201811'; 5.4.4 增加多个分区 [bigdata12:21000] > alter table stu_par add partition (month='201812') partition (month='201813'); 5.4.5 删除分区 [bigdata12:21000] > alter table stu_par drop partition (month='201812'); 5.4.5查看分区 [bigdata12:21000] > show partitions stu_par; 5.5 创建视图

#创建视图 create view if not exists stu_view as select name from student; #展示视图 show tables; #查询视图 select * from stu_view; #更改视图 alter view stu_view as select id from student; #删除视图 drop view stu_view; 5.6 常用SQL 5.6.1 insert 语句 #创建表 create table person(id int ,name string, age int); #插入数据 insert into person values(1,'A',18); insert into person values(1,'A_1',20); insert into person values(2,'B',29); insert into person values(3,'C',16); insert into person values(4,'D',40);

5.6.2 ORDER BY 语句

select * from person order by age desc; 5.6.3 GROUP BY 语句

insert into person values(1,'A',21);

select name,sum(age) from person group by name; 5.6.4 Having 语句

select name,sum(age) from person group by name having sum(age) >30; 5.6.5 Limit 语句

select * from person order by id limit 3; 5.6.6 offset 语句

select * from person order by id limit 3 offset 1;

 

5.6.7 union 语句

select * from stu_view union select name from person;

六、DML数据操作

6.1 数据导入(基本同hive类似) 注意:impala不支持load data local inpath… 6.2 数据的导出 1.impala不支持insert overwrite…语法导出数据 2.impala 数据导出一般使用 impala -o [root@bigdata12 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt [root@bigdata12 ~]# cat output.txt 1001 tignitgn 1002 yuanyuan 1003 haohao 1004 yunyun Impala 不支持export和import命令

七、查询

基本的语法跟hive的查询语句大体一样 Impala不支持CLUSTER BY, DISTRIBUTE BY, SORT BY Impala中不支持分桶表 Impala不支持COLLECT_SET(col)和explode(col)函数 Impala支持开窗函数 [bigdata12:21000] > select name,orderdate,cost,sum(cost) over(partition by month(orderdate)) from business;

八、函数

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.itstar.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

将jar包上传到hdfs的指定目录 hadoop fs -put hive_udf-0.0.1-SNAPSHOT.jar /创建函数 [bigdata12:21000] > create function mylower(string) returns string location '/Hive-1.0-SNAPSHOT.jar' symbol='Lower';使用自定义函数 [bigdata12:21000] > select id,mylower(name) from student; 8.通过show functions查看自定义的函数 [bigdata12:21000] > show functions; Query: show functions +-------------+-----------------+-------------+---------------+ | return type | signature | binary type | is persistent | +-------------+-----------------+-------------+---------------+ | STRING | mylower(STRING) | JAVA | false | +-------------+-----------------+-------------+---------------+

九、存储和压缩

 

注:impala不支持ORC格式 创建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;

十、优化

尽量将StateStore和Catalog单独部署到同一个节点,保证他们正常通行。 通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率。 SQL优化,使用之前调用执行计划 选择合适的文件格式进行存储,提高查询效率。 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中) 使用合适的分区技术,根据分区粒度测算 使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致impala选择不同的连接顺序时,表中使用的查询。 [bigdata13:21000] > compute stats student; Query: compute stats student +-----------------------------------------+ | summary | +-----------------------------------------+ | Updated 1 partition(s) and 2 column(s). | +-----------------------------------------+ 网络io的优化: –a.避免把整个数据发送到客户端 –b.尽可能的做条件过滤 –c.使用limit字句 –d.输出文件时,避免使用美化输出 –e.尽量少用全量元数据的刷新 使用profile输出底层信息计划,在做相应环境优化

 

最新回复(0)