龙空技术网

大数据Hadoop之——基于Hive的内存型SQL查询引擎Impala

大数据老司机 309

前言:

目前看官们对“apachehadoopimpala”大致比较看重,朋友们都需要剖析一些“apachehadoopimpala”的相关知识。那么小编在网络上搜集了一些对于“apachehadoopimpala””的相关内容,希望各位老铁们能喜欢,姐妹们一起来学习一下吧!

一、概述

Impala 直接针对存储在 HDFS、HBase或 Amazon Simple Storage Service (S3)中的 Apache Hadoop 数据提供快速的交互式 SQL 查询。Impala是一个基于Hive、分布式、大规模并行处理(MPP:Massively Parallel Processing)的数据库引擎。除了使用相同的统一存储平台外,Impala 还使用与 Apache Hive 相同的元数据、SQL 语法(Hive SQL)、ODBC 驱动程序和用户界面(Hue 中的 Impala 查询 UI)。关于Hive的介绍,可以看我之前的文章:大数据Hadoop之——数据仓库Hive。Impala官方文档

Impala 是可用于查询大数据的工具的补充。Impala 不会替代基于 MapReduce 构建的批处理框架,例如 Hive。Hive 和其他基于 MapReduce 构建的框架最适合长时间运行的批处理作业,例如涉及提取、转换和加载 (ETL) 类型作业的批处理。Impala 于 2017 年 11 月 15 日从 Apache 孵化器毕业。在文档中以前称为“Cloudera Impala”的地方,现在正式名称为“Apache Impala”。1)Impala优点基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销。无需转换为Mapreduce,直接访问存储在HDFS, HBase中的数据进行作业调度,速度快。使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销。支持各种文件格式,如TEXTFILE、SEQUENCEFILE、RCFile. Parqueto可以访问hive的metastore,对hive数据直接做数据分析。2)Impala缺点对内存的依赖大,且完全依赖于hive。实践中,分区超过1万,性能严重下降。只能读取文本文件,而不能直接读取自定义二进制文件。每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新。二、Impala架构1)Impala组件组成

一张图带你了解全貌:

下面的概述更官方

1、Client

客户端——包括 Hue、ODBC 客户端、JDBC 客户端和 Impala Shell 在内的实体都可以与 Impala 交互。这些接口通常用于发出查询或完成管理任务,例如连接到 Impala。

2、Impalad

Impala的核心组件是Impala守护进程,它的物理代表是impalad进程。Impala守护进程的几个关键功能是:

读写数据文件。接受从impala-shell命令、Hue、JDBC或ODBC传输的查询。并行化查询并在集群中分配工作。将中间查询结果传回中央协调器。

【温馨提示】

HDFS和Impala是共存的,每个Impala守护进程和DataNode运行在同一个主机上Impala单独部署在计算集群中,可以远程从HDFS、S3、ADLS等读取数据。3、Statestore

Statestore服务主要负责metadata的广播检查集群中所有Impala守护进程的健康状况,并不断地将其发现传递给每一个这些守护进程。它在物理上由一个名为stateststored的守护进程表示。该进程只需要在集群中的一台主机上运行。如果一个Impala守护进程由于硬件故障、网络错误、软件问题或其他原因而离线,StateStore会通知所有其他的Impala守护进程,这样以后的查询就可以避免向这个不可达的Impala守护进程发出请求。

4、Catalog

Catalog 服务负责metadata的获取和DDL的执行,将Impala SQL语句的元数据更改传递给集群中的所有Impala守护进程。它在物理上由一个名为catalogd的守护进程表示。该进程只需要在集群中的一台主机上运行。因为请求是通过StateStore守护进程传递的,所以在同一主机上运行StateStore和Catalog服务是更好的。

当通过Impala发出的语句执行元数据更改时,catalog服务避免发出REFRESH和INVALIDATE METADATA语句。当你通过Hive创建表、加载数据等等时,在执行查询之前,你需要在Impala守护进程上发出REFRESH或INVALIDATE元数据。

5、数据存储服务

HBase或HDFS——用于存储要查询的数据。

2)Impalad服务的三种角色

Impala的核心进程Impalad,部署在所有的数据节点上,接收客户端的查询请求,读写数据,并行执行来自集群中其他节点的查询请求,将中间结果返回给调度节点。调用节点将结果返回给客户端。Impalad进程通过持续与StateStore通信来确认自己所在的节点是否健康以及是否可以接受新的任务请求。

Query Planner——Java编写的,解析SQL生成QueryPlanTree执行计划树。Query Coordinator——用户在Impala集群上的某个节点提交数据处理请求(例如impala-shell提交SQL),则该Impalad节点称为Coordinator Node(协调节点),负责定位数据位置,拆分请求(Fragment),将任务分解为多个可并行执行的小请求,发送这些请求到多个Query Executor,接收Query Executor处理后返回的数据并构建最终结果返回给用户。Query Executor——执行数据计算,比如scan,Aggregation,Merge等,返回数据。3)Impala运行原理1、启动服务时执行的操作2、查询SQL的运行流程3、数据计算流程三、Impala环境部署(CDH集成)

这里通过CM安装方式集成到CDH,方便管理,CDH的安装可以看我之前的文章:

大数据Hadoop之——Cloudera Hadoop环境部署

1)添加服务2)自定义角色分配3)审核更改

下一步就进入自动安装过程,时间有点久,耐心等待安装完即可

4)安装完成5)启动服务6)验证

$ impala-shellshow databases
四、Impala与其它对比

多用户如下图所示(引用自Apache Impala官网):

查询吞吐率如下图所示(引用自Apache Impala官网):

由上图测试结果可知,对于单用户查询,Impala比其它方案最多快13倍,平均快6.7倍。对于多用户查询,差距进一步拉大:Impala比其它方案最多快27.4倍,平均快18倍。

五、Impala shell简单使用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 or --output_file_filename

保存所有查询结果到指定的文件。通常用于保存在命令行使用-q选项执行单个查询时的查询结果

-c

查询执行失败时继续执行

-d default_db or --default_db=default_db

指定启动后使用的数据库,与建立连接后使用use语句选择数据库作用相同,如果没有指定,那么使用default数据库d

-p, --show_profiles

对shell中执行的每一个查询,显示其查询执行计划

-r or --refresh_after_connect

建立连接后刷新 Impala 元数据,新版已经没有这个参数了。换成这样刷新:impala-shell -q "invalidate metadata",不刷新的话,就看不到新创建的库表了。

-B (--delimited)

去格式化输出

--output_delimiter=character

指定分隔符

--print_header

打印列名

操作都是很简单,查看帮忙执行几个例子演示一下就行,这就不再演示了。主要是sql操作,sql的话,懂编程的人,应该对sql不陌生,也不是很难。

2)Impala内部shell(交互式)

标红的就是常用的

选项

描述

help

查看帮助信息

explain

显示执行计划

profile

(查询完成后执行)查询最近一次查询的底层信息

shell <shell>

不退出impala-shell执行shell命令

version

显示版本信息(同于impala-shell -v)

connects

连接 impalad 主机,默认端口 21000(同于 impala-shell -i)

refresh <tablename>

增量刷新元数据库

invalidate metadata

全量刷新元数据库(慎用)

history

查看历史命令

3)Impala数据类型

Hive数据类型

Impala数据类型

长度

TINYINT

TINYINT

1 byte有符言整数

SMALINT

SMALINT

2 byte有符号整数

INT

INT

4 byte有符号整数

BIGINT

BIGINT

8 byte有符号整数

BOOLEAN

BOOLEAN

布尔类型,true或者false

FLOAT

FLOAT

单精度浮点数

DOUBLE

DOUBLE

双精度浮点数

STRINGS

STRINGS

字符系列。可以指定字符集。可以使用单引号或者双引号。

TIMESTAMPS

TIMESTAMPS

时间类型

BINARY

不支持

字节数组

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

4)DDL数据定义

都是一些很基础的操作

1、创建数据库

create database db_name

【温馨提示】Impala不支持WITH DBPROPERTIE...语法

2、查询数据库

show databases;
3、删除数据库
drop database db_name

【温馨提示】Impala不支持修改数据库(alter database )

4、创建表

create table if not exists student(id int,name string);show tables;desc student;show create table student;
5、创建分区表
create table stu_partion(id int,name string) partitioned by (month string)row format delimitedfields terminated by '\t'show tables;
5)DML数据操作1、向表中导数据
# 文件字段一tab分隔,上面创建表时定义了分隔符$ cat > /tmp/student.txt << EOF1	stu12	stu23	stu34	stu4EOF$ sudo -u hdfs hadoop fs -put /tmp/student.txt /tmp/# 授权,要不然没有权限$ sudo -u hdfs hadoop fs -chown impala:hive /tmp/student.txt$ impala-shell# 【温馨提示】hdfs集群上更改权限之后,一定要记住登录到impala-shell上使用invaladate metadata命令进行元数据更新,否则更改的权限在impala状态下是不生效的!!!,执行下面这句就行了。invalidate metadata;# 添加分区alter table stu_partion add partition (month='20220415');# 删除分区,这里不执行alter table stu_partion drop partition (month='20220415');# 加载数据,加载完,这个文件/tmp/student.txt会被删掉load data inpath '/tmp/student.txt' into table stu_partion partition (month='20220415');# 查看检查select * from stu_partion;

【温馨提示】如果分区没有,load data 导入数据时,不能自动创建分区。还有就是不能到本地数据,只能到hdfs上的数据。

2、数据导出

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

$ impala-shell -q 'select * from stu_partion' -B --output_delimiter="\t" -o output.txt

一般DML由hive来操作,impala负责查询。

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

因为查询sql跟mysql的一样,所以这里就不演示了。

7)函数

跟hive和mysql函数差不多,像count、sum等内置函数,当然也支持自定义函数。有兴趣的小伙伴可以去练习一下,比较简单。

impala的简单使用就到这里了,有疑问的话,欢迎给我留言,后续会更新更多关于大数据的文章,请耐心等待~

标签: #apachehadoopimpala