记一次impala的认识与学习。
概念
-
impala是一个实时的sql查询工具,类似于hive的操作方式,只不过执行的效率极高,号称当下大数据生态圈中执行效率最高的sql类软件。
-
impala来自于cloudera,后来贡献给了apache
-
impala工作底层执行以来于hive,与hive共用一套元数据存储,在使用impala的时候,必须保证hive服务是正常可用的,至少metastore开启。
-
impala最大的跟hive的不同在于,不在把sql编译成mr程序执行编译成执行计划树。
-
impala的sql语法几乎兼容hive的sql语句。
- impala是一个适用于实时交互查询的sql软件,hive适合于批处理查询的SQL软件。通常是两个相互配合。
- Impala可以集群部署
- impala(impala server)可以部署多个不同机器上,通常与datanode部署在同一个节点方便数据本地计算,负责具体执行本次查询SQL的impalad称之为Coordinator,每个impala server都可以对外提供服务。
- impala state store:主要是保存impalad的状态信息,监视其健康状态。
- impala catalogd:metastore维护的网关 负责跟hive的metastore进行交互,同步hive的元数据到impala自己的元数据中。
- CLI:用户操作impala的方式(impala shell, jdbc ,hue)
- impala查询处理流程。
- impala分为Java前端(接收解析sql编译成执行的计划树),C++后端(负责具体的执行计划树操作)。
- impala SQL —>impalad(Coordinator)—>调用java前端编译sql成计划树---->以Thrift数据格式返回给C++后端---->根据执行计划树、数据位于的路径(libhdfs和hdfs交互)、impalad状态分配执行计划 查询 —>汇总查询结构---->返回给java前端---->用户CLI。
- 与hive不同就在于整个执行中已经没有再用到MR了
impala与hive的异同点:
最大的不同:impala没有使用MR进行并行计算。
- impala使用的优化技术
1. 使用LLVM产生运行代码,针对特定查询生成特定代码,同时使用Inline的方式减少函数调用的开销,加快执行效率。(C++特性)
充分利用可用的硬件调度指令。
更好的IO调度,Impalad知道数据块所在的磁盘位置能够更好的利用多磁盘的又是,同时Impala支持直接数据块读取和本地代码计算(checksum)。
通过选择合适数据存储格式可以得到最好性能(Impala支持多种存储格式)。
最大使用内存,中间结果不写磁盘,及时通过网络以stream的方式传递。
-
执行计划
hive:依赖于MR执行框架,执行计划分成map->shuffle->reduce->map->shuffle->reduce…模型。如果一个Query会被编译成多轮MR,则会由更多的写中间结果。由于MR执行框架本身的特点,过多的中间过程会增加Query的执行时间。
Impala:把执行计划表现为一颗完整的执行计划树,可以更自然地分发执行计划到各个Impala的执行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。
-
数据流
hive:采用推的方式,每一个计算节点计算完成后将数据主动推给后续节点。
Impala:采用拉的方式,后续节点通过getNext主动向前面的节点要数据,以此方式数据可以流式的返回给客户端,且只要有一条数据呗处理完就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。
-
适用面
hive:复杂的批处理查询任务,数据转换任务。
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与hive配合使用,对hive的结果数据集进行实时分析。
Impala架构
主要由Impalad、StateStore、Catalogd和CLI组成
-
Impalad
与DataNode运行在同一节点上,由Impalad进程表示,它接受客户端的查询请求(接受查询请求的Impalad为Coordinator,Coodinator通过JNI调用Java前端解释SQL查询语句,
-
Impala State Store
-
Catalogd
-
Impala查询处理过程
Impala安装部署
- impala安装
- impala没有提供tar包,这个rpm包只有cloudra公司
- 要么自己去官网下载impala rpm包和相关的依赖和提供的web服务,使得各个机器都可以访问下载yum源。
- 通过ps -ef | grep impala 判断启动的进程是否正常,如果出错,日志是你解决问题的唯一依据。
- /var/log/impala
Impala-shell 命令参数
-
impala-shell -h 显示帮助菜单。
-
impala-shell -i + 主机地址 指定连接impala守护进程的主机。默认端口是21000.你可以连接到集群运行impalad的任意主机。
-
impala-shell -o 保存执行结果到文件当中去。
-
impala-shell -f +文件地址 执行SQL脚本文件
-
connect + 主机名 实现不同机子之间的连接转换。
-
refresh dbname.tablename 增量刷新,率先你某一张表的元数据,主要用于刷新hive当中的数据表里面的数据改变的情况。
-
invalidate metadata全量刷新,性能消耗较大,主要用于hive当中新建数据库或者数据库表的时候来进行刷新。
-
explain命令用于查看SQL语句的执行情况。
impala sql 语法(不支持自定义函数)
- 需要在impala用户下进行去写SQL语法。
- 出现权限不足现象解决方法:
- 给HDFS指定的文件夹授予权限。
- hdfs dfs -chmod -R 7777 hdfs://node–1:9000/user/hive
- Hadoop配置文件中hdfs-site.xml中设置权限为false
- 给HDFS指定的文件夹授予权限。
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
-
删除数据库
- impala的drop database语句用于从impala中删除数据库。在删除数据库之前,建议从中删除所有表。
- 如果使用级联删除,Impala会在删除指定数据库中的表之前删除它。
- DROP database sample cascade.
-
创建表
- CREATE TABLE 语句用于在impala中的所需数据库中创建新库,需要指定表名字并定义其列和每列的数据类型。
- impala支持的数据类型和hive相似,除了sql类型外,还支持java类型。
-
create table IF NOT EXISTS database_name.table_name( column1 data_type, column2 data_type, column3 data_type, ………… columnN data_type );
-
插入操作
- impala的INSERT语句有两个子句:into和overwrite。into用户插入新记录数据,overwrite用户覆盖已有的记录。
-
insert into table_name(column1,column2,column3.....columnN) values(value1,value2,value3......valueN); insert into table_name values(value1,value2,value3....)
- 这里,column1,2,3…n是要插入数据的表中的列的名称。还可以添加值而不指定列名,但是,需要确保值得顺序与表中的列的顺序相同。
- 举个例子
-
describe 语句
- impala中describe语句用于查看提供表的描述。此语句的结果包含有关表的信息,例如列名称及其数据类型。
- describe table_name
- 此外,还可以使用hive的查询表元数据信息语句。
- desc formatted table_name
-
alter table
- impala中的Alter table语句用于对给定表执行更改。使用此语句,可以添加、删除或者修改现有表中的列,也可以重命名他们。
- 表重命名
- ALTER TABLE [OLD_DB_NAME] old_table_name RENAME TO [new_db_name] new_table_name;
- 从表中添加列:
- ALTER TABLE NAME ADD COLUMNS(COL_SPEC[,COL_SPEC…])
- 从表中删除列
- ALTER TABLE NAME DROP [COLUMN] COLUMN_NAME
- 更改列的名称和类型:
- ALTER TABLE NAME CHANGE COLUMN_NAME NEW_NAME NEW_TYPE
- 表重命名
- impala中的Alter table语句用于对给定表执行更改。使用此语句,可以添加、删除或者修改现有表中的列,也可以重命名他们。
-
delete\truncate table
- impala drop table 语句用于删除impala中的现有表。此语句还会删除内部表的底层HDFS文件。
- 注意:使用此命令时必须小心,因为删除表后,表中可用的所有信息也将永远丢失。
- DROP table database_name.table_name;
- impala的Truncate Table语句用于现有表中删除记录。保留表结构。也可以时用DROP table命令删除一个完整的表,但它会从数据库中删除完整的表结构。若希望存储一些数据,需重新创建此表。
- impala drop table 语句用于删除impala中的现有表。此语句还会删除内部表的底层HDFS文件。
-
view 视图
- 视图仅仅是存储在数据库中具有关联名的Impala查询语言的语句。它是以预定义的SQL查询的形式的表的组合。
- 视图可以包含表的所有行或选定的行。
- CREATE View if not exists view_name as Select statement
- 创建视图VIEW、查询视图View
- Create view if not exists employee_view AS select name,age from employee;
- 修改视图
- ALTER view database_name.view_name 为Select语句
- 删除视图
- DROP VIEW database_name.view_name;
-
order子句
- impala ORDER BY 子句用于根据一个或多个列以升序或降序对数据进行排序。默认情况下,一些数据库按升序对查询结果进行排序。
- select * from table_name ORDER BY col_name [ASC|DESC] [NULLS FIRST|NULLS LAST]
- 可以使用关键字ASC或DESC分别按升序或降序排列表中的数据。
- 如果我们使用NULLS FIRST,表中所有的空值都排列在项行;如果我们使用NULLS LAST,包含空值的行将最后排列。
- impala ORDER BY 子句用于根据一个或多个列以升序或降序对数据进行排序。默认情况下,一些数据库按升序对查询结果进行排序。
-
having子句
- impala中Having子句允许指定过滤哪些组结果显示在最终结果中的条件。
- 一般来说,Having子句与groupby子句一起使用;它将条件防止在GROUP BY子句创建的组上。
-
limit、offset
- impala中的limit子句用于将结果集的行数限制为所需的行数,即查询的结果集不包含超过指定限制的记录。
- 一般来说,select 查询的resultset中的行从0开始,使用offset子句,可以决定从哪里考虑输出。
-
with子句
- 如果查询太复杂,可以为复杂部分定义别名,并使用impala的with子句将他们包含在查询中。
- with x as (select 1),y as (select 2) (select* from x union y);
-
distinct
- impala中的distinct运算符用于通过删除重复值来获取唯一值。
- select distinct column … from table_name;
- impala中的distinct运算符用于通过删除重复值来获取唯一值。
impala 数据导入方式
- load data (会将被加载文件进行一个移动,移动到该表对应的路径下)
- 首先创建一个表:
- create table user …
- 加载数据
- load data inpath ‘/user/…’ into table user;
- 查询加载的数据
- select * from user;
- 首先创建一个表:
- insert into values
- 这种方式非常类似于RDBMS的数据插入方式。
- create table t_test2(id int,name string);
- insert into table t_test2 value(1,“zhangsan”);
- insert into select
- 插入一张表的数据来自于后面的select查询语句返回的结果。
- create as select
- 建表的字段个数、类型、数据来自于后续的select查询语句。
impala 的java开发
- 下载jdbc connector的jar包。导入开发环境