impala 3.2.0
基于hive 2.1.1 kudu1.9
Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)sql查询引擎。 它是一个用C ++和Java编写的开源软件。 与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。
换句话说,Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。
Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的子集,
1、架构
Impala是在hadoop集群中的许多系统上运行的MPP(大规模并行处理)查询执行引擎。 与传统存储系统不同,impala与其存储引擎解耦。 它有四个主要组件,即Impala daemon(Impalad),Impala Statestore和impala Catelog,以及CLI。
Impalad:负责协调客户端提交变得查询的执行,与HDFS的数据节点运行在同一节点上。
State Store:负责收集分布在集群中各个Impalad进城的资源信息用于查询调度。
Impala Catelog:Catalog 负责将元数据变化推送到所有的Impalad 进程节点上,例如创建,修改,删除或者 Insert / load 等操作,Catalog 会连接到元数据库并进行元数据更新操作。Catalog还负责从HiveMetestore 获取元数据。
impala元数据:由hive metastore 存储元数据。
CLI: 提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口。
DBeaver中配置的使用JDBC来访问。
1.1、Impala 存储的状态
Impala有另一个称为Impala State存储的重要组件,它负责检查每个Impalad的运行状况,然后经常将每个Impala Daemon运行状况中继给其他守护程序。 这可以在运行Impala服务器或群集中的其他节点的同一节点上运行。
Impala State存储守护进程的名称为存储的状态。 Impalad将其运行状况报告给Impala State存储守护程序,即存储的状态。
在由于任何原因导致节点故障的情况下,Statestore将更新所有其他节点关于此故障,并且一旦此类通知可用于其他impalad,则其他Impala守护程序不会向受影响的节点分配任何进一步的查询。
1.2、Impala元数据和元存储
Impala元数据和元存储是另一个重要组件。 Impala使用传统的MySQL或postgresql数据库来存储表定义。 诸如表和列信息和表定义的重要细节存储在称为元存储的集中式数据库中。
每个Impala节点在本地缓存所有元数据。 当处理极大量的数据和/或许多分区时,获得表特定的元数据可能需要大量的时间。 因此,本地存储的元数据缓存有助于立即提供这样的信息。
当表定义或表数据更新时,其他Impala后台进程必须通过检索最新元数据来更新其元数据缓存,然后对相关表发出新查询。
1.3、查询处理接口
要处理查询,Impala提供了三个接口,如下所示。
- Impala-shell - 使用Cloudera VM设置Impala后,可以通过在编辑器中键入impala-shell命令来启动Impala shell。 我们将在后续章节中更多地讨论Impala shell。
- Hue界面 - 您可以使用Hue浏览器处理Impala查询。 在Hue浏览器中,您有Impala查询编辑器,您可以在其中键入和执行impala查询。 要访问此编辑器,首先,您需要登录到Hue浏览器。
- ODBC / JDBC驱动程序 - 与其他数据库一样,Impala提供ODBC / JDBC驱动程序。 使用这些驱动程序,您可以通过支持这些驱动程序的编程语言连接到impala,并构建使用这些编程语言在impala中处理查询的应用程序。
1.4、查询执行过程
每当用户使用提供的任何接口传递查询时,集群中的Impalads之一就会接受该查询。 此Impalad被视为该特定查询的协调程序。
在接收到查询后,查询协调器使用Hive元存储中的表模式验证查询是否合适。 稍后,它从HDFS名称节点收集关于执行查询所需的数据的位置的信息,并将该信息发送到其他impalad以便执行查询。
所有其他Impala守护程序读取指定的数据块并处理查询。 一旦所有守护程序完成其任务,查询协调器将收集结果并将其传递给用户。
2、与hive异同
相同:
- 数据存储:使用相同的存储数据池都支持把数据存储于HDFS, HBase。
- 元数据:两者使用相同的元数据。
- SQL解释处理:比较相似都是通过词法分析生成执行计划。
2.1、执行计划
hive依赖MapReduce
Impala把执行计划表现为一颗完整的执行计划树,可以更自然的分发执行计划到个Impalad执行查询。
2.2、数据流
hive采用推的方式,计算完成后主动推送到后续节点
Impala采用拉的方式,后续节点通过getNext主动向前节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
2.3、内存
hive在执行过程中内存放不下所有数据则会适用堆外内存,保证query顺序完成,每一轮MapReduce结束,中间结果也会写入HDFS中,
impala:在遇到内存放不下数据时,当前版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。
2.4、调度
Hive: 任务调度依赖于Hadoop的调度策略。
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。
2.5、容错
Hive: 依赖于Hadoop的容错能力。
impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败, 再查一次就好了,再查一次的成本很低)。
2.6、适用面
Hive: 复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。
-
Impala不提供虚拟列。
-
Impala不公开锁定。
-
Impala不公开某些配置属性。
3、impala-shell 语法
3.1、impala-shell 语法
- impala-shell 【参数】[sql]
- -h 查看帮助文档
- -r 刷新整个元数据,量大时比较消耗服务器性能
impala-shell -r
- -B 去格式化,查询大量数据
impala-shell -q sql -B
加上分隔符 --output_delimiter= - -f 执行查询文件
impala-shell -f /opt/.sql
- -i 连接指定impalad执行任务
impala-shell -i node01
- -o 保存结果到文件中去
impala-shell -f sql -o txt
- -p 显示查询计划
impala-shell -f sql -p
- -q 执行片段sql语句
impala-shell -q "sql"
- -c 失败继续执行
impala-shell -c -f tt.sql
3.2、shell内部命令行
-
impala-shell 进入内部命令行
-
help命令
-
connect 连接指定机器上执行
connect node02;
-
refresh 增量刷新(刷新表元数据)
refresh dbname.tablename;
-
invalidate metadata 全量刷新 (库元数据刷新)
invaliddate metadata;
-
explain 查询sql语句执行计划
explain sql;
-
profile 执行sql语句之后执行,可以打印出更详细的执行步骤,
sql; profile;
-
查看hdfs及linux文件系统
shell hadoop fs -ls /;
shell ls -al ./;
-
history
3.2.1、show table stats 检查统计信息
-- 显示表和分区级别的统计信息.
show table stats table_name;
-- 如果返回第一列 #Rows 值-1, 表名还没有收集过统计信息.
-- 显示列级别的统计信息.
show column stats table_name ;
3.2.2、compute stats收集统计信息
-- 对于非分区表, 推荐使用COMPUTE STATS, 速度更快
COMPUTE STATS table_name ;
-- --对于分区表, 推荐使用COMPUTE INCREMENTAL STATS, 速度更快一些.
COMPUTE INCREMENTAL STATS table_name ;
-- table通过Hive增加了分区, 需要先进行refresh, 然后增量收集统计信息.
REFRESH table_name;
COMPUTE INCREMENTAL STATS table_name;
-- 删除统计信息
DROP STATS table_name
DROP INCREMENTAL STATS table_name PARTITION (key_col1=val1 [, key_col2=val2...])]
3.2.3、显示执行计划explain
-- 返回语句的执行计划,显示 Impala 用于读取数据、在集群中的节点之间划分工作以及通过网络传输中间和最终结果的低级机制。使用explain后跟完整的 SELECT查询。
EXPLAIN { select_query | ctas_stmt | insert_stmt }
4、impala数据类型
Sr.No | 数据类型 | 说明 |
---|---|---|
1 | BIGINT | 此数据类型存储数值,此数据类型的范围为-9223372036854775808至9223372036854775807.此数据类型在create table和alter table语句中使用。 |
2 | BOOLEAN | 此数据类型只存储true或false值,它用于create table语句的列定义。 |
3 | CHAR | 此数据类型是固定长度的存储,它用空格填充,可以存储最大长度为255。 |
4 | DECIMAL | 此数据类型用于存储十进制值,并在create table和alter table语句中使用。 |
5 | DOUBLE | 此数据类型用于存储正值或负值4.94065645841246544e-324d -1.79769313486231570e + 308范围内的浮点值。 |
6 | FLOAT | 此数据类型用于存储正或负1.40129846432481707e-45 … 3.40282346638528860e + 38范围内的单精度浮点值数据类型。 |
7 | INT | 此数据类型用于存储4字节整数,范围从-2147483648到2147483647。 |
8 | SMALLINT | 此数据类型用于存储2字节整数,范围为-32768到32767。 |
9 | STRING | 这用于存储字符串值。 |
10 | TIMESTAMP | 此数据类型用于表示时间中的点。 |
11 | TINYINT | 此数据类型用于存储1字节整数值,范围为-128到127。 |
12 | VARCHAR | 此数据类型用于存储可变长度字符,最大长度为65,535。 |
13 | ARRAY | 这是一个复杂的数据类型,它用于存储可变数量的有序元素。 |
14 | Map | 这是一个复杂的数据类型,它用于存储可变数量的键值对。 |
15 | Struct | 这是一种复杂的数据类型,用于表示单个项目的多个字段。 |
4、DDL操作
-- 显示所有库
show database;
-- 显示表创建语句
show create table_name;
-- 创建库
create database dbname;
-- 创建可能存在的库
create database if not exists dbname;
-- 删除库
drop database dbname;
-- 删除可能存在的externaltemp1表
drop table if exists externaltemp1;
-- 显示表结构
describe table_name;
-- 显示表详细结构
describe formatted table_name;
-- 查询建表语句
SHOW CREATE TABLE tablename;
4.1、创建表
create table IF NOT EXISTS database_name.table_name (
column1 data_type,
column2 data_type,
column3 data_type,
………
columnN data_type
)
-- 字段按照“,”分割
row format delimited fields terminated by ','
-- 行按照“\n”分割
lines terminated by '\n'
-- text格式存储 也可以parquet、kudu等
STORED AS TEXTFILE;
-- Hdfs地址 此为外部表要指明位置,内部表无需指明
LOCATION 'hdfs_path';
4.2、删除表与清空表
- 删除表
-- 删除表
DROP table database_name.table_name;
drop table if exists my_db.student;
-- 清空表数据 保留结构 基于HDFS
truncate tmp.customers;
-- 基于kudu 删除表内容
delete from tmp.t_hy_customer_num_dd where 1=1;
4.3、insert 语句
-- 指明列字段添加数据
insert into table_name (column1, column2, column3,...columnN) values (value1, value2, value3,...valueN);
-- 添加值而不指定列名,但是,您需要确保值的顺序与表中的列的顺序相同
Insert into table_name values (value1, value2, value2);
- 基于HDFS 可以用 insert overwrite 语句
-- 基于HDFS存储,如果是kudu就不能使用
Insert overwrite table_name values (value1, value2, value2);
4.4、alter table语句
-- 重新命表名
ALTER TABLE my_db.customers RENAME TO my_db.users;
-- 向表中添加一列 增加字段
ALTER TABLE tablename add columns (IS_AUTH VARCHAR(8) comment'是否实名认证0未实名 1已实名')
-- 删除一列
ALTER TABLE tablename drop ACTIVE_LENGTH
-- 修改字段名称及类型
ALTER TABLE tablename CHANGE old_ind new_ind varchar(40) comment '收取要求'
-- 删除分区
ALTER TABLE tablename drop if exists partition(dt = '20190520')
ALTER TABLE tablename drop partition ( dt !='20201105')
5、内外部表
5.1、内部表
create table t_user2(
id int,
pwd string
) partitioned by(grade int)
row format delimited fields terminated by ','
lines terminated by '\n'
STORED AS TEXTFILE;
-- 基于kudu表
PARTITION BY HASH (id) PARTITIONS 3
STORED AS KUDU
TBLPROPERTIES ('kudu.master_addresses'='hbnn1')
4.5、创建视图
-- 创建视图
Create View IF NOT EXISTS view_name as Select statement
-- 修改视图
Alter view customers_view as select id, name, salary from customers;
-- 删除视图
DROP VIEW database_name.view_name;
5.2、外部表
cast(column_name as decimal(10,2)) 获取小数几位数字
-- EXTERNAL 外部表
CREATE EXTERNAL TABLE IF NOT EXISTS test.t_date (
date_id BIGINT comment "date id",
pdate TIMESTAMP comment "date",
pyear STRING comment "a particular year"
)
-- 指明列之间的分隔符为','
row format delimited fields terminated by ','
-- 指明行之间的分隔符为"\n"
lines terminated by '\n'
-- 指明外部表数据存储位置
location '/user/hive/wbb/t_date';
5.3、外部表导入数据
- 加载数据
-- impala 刷新元数据
refresh <tablename>
-- hive加载方式
load data inpath '/user/impala/' into table user;
-- 切记必须和hiveserver2在同一个节点才可以上传否则
-- SemanticException Line 1:23 Invalid path ''/root/d3.txt'': No files matching path file
load data local inpath '/root/user.txt' into table t_user;
-- 加载并覆盖已有数据
load data inpath '/yjx/user.txt' overwrite into table t_user;
- 子查询建表
create table user2 as select * from user;
- insert into # 不推荐使用
- insert into select ;