Apache Impala
记一次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包。导入开发环境
Apache Impala相关推荐
- Apache Impala 4.1概览
Apache Impala 4.1概览 自从Impala 4.0发布后,历时近11个月,Impala 4.1终于发布了!新版本在Iceberg集成.Catalog优化.Parquet/ORC读取性能. ...
- 初探Apache Impala
Impala是什么? Impala提高了Apache Hadoop上SQL查询性能的标准,同时保留了熟悉的用户体验.使用Impala,您可以实时查询存储在HDFS或Apache HBase中的数据-包 ...
- Apache Impala : Impala安装部署
Impala Impala安装部署 安装前提 下载安装包.依赖包 虚拟机新增磁盘(可选) 关机新增磁盘 开机挂载磁盘 配置本地yum源 上传安装包解压 配置本地yum源信息 安装Impala 集群规划 ...
- Apache Impala: Impala的java开发
Impala的java开发 在实际工作当中,因为impala的查询比较快,所以可能有会使用到impala来做数据库查询的情况,可以通过java代码来进行操作impala的查询. 下载impala jd ...
- Apache Impala总结
Impala 基于hive,使用内存计算,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能.Impala适合用来处理输出数据适中或比较小的查询. 组件简绍 Impala Sta ...
- Apache Impala —— 3.4.0版本官方文档百度网盘下载链接
百度网盘链接: https://pan.baidu.com/s/18OW28Qp–5nEhmwpNosnCw 提取码:pfhw 文档目录内容
- 未明确定义列存储过程没问题_使用Apache Kudu和Impala实现存储分层
当为应用程序的数据选择一个存储系统时,我们通常会选择一个最适合我们业务场景的存储系统.对于快速更新和实时分析工作较多的场景,我们可能希望使用 Apache Kudu ,但是对于低成本的大规模可伸缩性场 ...
- 使用Apache Kudu和Impala实现存储分层
为什么80%的码农都做不了架构师?>>> 当为应用程序的数据选择一个存储系统时,我们通常会选择一个最适合我们业务场景的存储系统.对于快速更新和实时分析工作较多的场景,我们可能希 ...
- Apache Kudu 与 Impala Shell 的结合使用文档(创建表、删、改、查)
Kudu与Apache Impala紧密集成,允许您在Impala使用Impala的SQL语法从Kudu去做 插入,查询,更新和删除数据,作为使用Kudu API 构建自定义Kudu应用程序的替代方法 ...
最新文章
- axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理
- 树莓派python网络通信_Python3使用Socket实现树莓派与计算机半双工通信,实现聊天功能...
- android 断开蓝牙连接,如何在android中连接和断开扬声器蓝牙
- 机器学习之单标签多分类及多标签多分类
- python中字母用什么表示_python中字母与ascii码的相互转换
- vue中align_Vue的简单Treeview组件,没有额外的依赖——VueTeatree
- 我的世界服务器自定义怪物怎么用,我的世界怪物属性自定义教程 怪物属性代码一览...
- ofbiz 分开默认数据库
- Python3之max key参数学习记录
- CCF201604-2 俄罗斯方块(100分)
- 网页鼠标点击特效案例收集
- 我的Qt作品(12)使用Qt+OpenCV实现一个带旋转角度的Shape形状匹配演示软件
- hprose for java 教程_Hprose for Java 快速入门
- 安卓游戏 我叫mt 3.5.4.0 3540,data.dat 文件解包记录
- 手把手教你通过Google Adsense“PIN码验证”
- ResHacker 3.5 汉化绿色版
- Windows U盘插入出现位置不可用 无法访问 拒绝访问
- mysql explain中的名词解释
- 谈谈Google AdSense以外的国外优秀广告联盟
- WIFI6:WLAN 组播转单播原理与测试