大家好,欢迎来到IT知识分享网。
#############################################################################
impala 的简介
Cloudera 公司推出 , 提供对HDFS , Hbase 数据的高性能 , 低延迟的交互SQL 查询功能
Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query Planner、Query Coordinator和Query Exec Engine三部分组成),可以直接从HDFS或HBase中用SELECT、JOIN和统计函数查询数据,从而大大降低了延迟。
基于 hive , 使用内存计算 , 兼顾数据仓库 , 具有实时 , 批处理 , 多并发的优点(多个客户端访问,没hive 开多个客户端消耗的性能大)
1. impala 完全基于hive , 并与hive 共享元数据
2.基于内存计算的(官方推荐的内存128G , 实际工作中一般64G)
3.是CDH 平台首选的 PB 级大数据实时查询分析引擎
############################################################################
impala 的优点
1.基于内存进行计算 , 能够对PB 级别数据进行交互式实时查询 , 分析 。Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。
2.无需转换为MR ,省掉了MapReduce作业启动的开销。MapReduce启动task的速度很慢(默认每个心跳间隔是3秒钟),Impala直接通过相应的服务进程来进行作业调度,速度快了很多。 直接读取HDFS 的数据
3. c++ 编写 ,做了很多有针对性的硬件优化, 通过使用LLVM来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。
4.兼容HiveSQL
5.具有数据仓库的特性 , 可对hive 数据直接做数据分析
6.支持Data Local
7.支持列式存储 ,多种存储格式可以选择(Parquet, Text, Avro, RCFile, SequeenceFile)。
8.支持JDBC / ODBC 远程访问
9.Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,而是像Dremel一样借鉴了MPP并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的shuffle、sort等开销。
impala 的劣势
1.对内存的依赖大
2.C++ 编写 , 源码不好看
3. 完全依赖于 hive , 有 impala 必须先有hive
4. 实践过程中 , 分区超过 1W , 性能严重下降
5 . 稳定性不如hive
6.不支持text域的全文搜索。
7.不支持Transforms。
8.不支持查询期的容错。
9.不支持用户定义函数UDF。
##################################################################
impala 的安装
1.ClouderaManager
2.手动安装 (版本兼容很差,不太建议 )
##################################################################
impala 的架构
impala 支持 jdbc , odb成,client , hue ,impala shell 的访问方式
impala 的角色
1. impala StateStore (可有可无 ,缺少了,只是不知道这个节点是否正常运行)
监控集群中各个节点的健康状况,提供节点注册、错误检测等功能
自己的理解:就是查看集群状态的
2.impala Catalog Server (impala 1.2 之后新加的角色 , 以前手动同步)
分发表的元数据信息到各个impalad 中
接受来自statestore 的所有请求
建表的信息同步不了 , hive 中建立了表 , impala 想查看 ,需要先把表的信息同步到impala 中
3. impala Daemon : 真正执行计算的
实例:impalad (可以有多个)
Impalad主要包含Query Planner、Query Coordinator和Query Exec Engine三个模块
接受client , hue , jdbc 或odbc请求 , Query 执行并发回给中心协调节点(即接受cleint的那台 Coordinator)
子节点上的守护进程 , 负责向statestore 保持通信 ,汇报工作
自己理解:接受客户端请求 ,然后返回数据给 Catalog Daemon 节点
自己的理解:.impala Catalog Server 和 impala StateStore 理解为一个impala主节点 ,相对来说impala 没有主节点的概念 ,只是相对来说 。Impala 部署于所有节点,无主仆之分,任意节点均可以直接接受任务。
Catalog 对hive 元数据的同步 , statestore 对集群状态的监控 ,会缓存 ,所以中途停止一段时间没事(不能加新的impalad , 加了也启动不掉 ,启动impala 会需要statestore)
impalad 的详细介绍
1.query planner : 接收来自SQL APP和ODBC的查询,然后将查询转换为许多子查询
2. query coordinator :将这些子查询分发到各个节点上 , 查询的时候只会使用到唯一处存在的调度器机器上的coordinator ,其他的不会涉及
3. query executor : 负责子查询的执行,最后返回子查询的结果,这些中间结果经过聚集之后最终返回给中心协调节点(即接受cleint的那台 Coordinator)。
因为statestore 和 catalog 之间需要相互通信 ,所以经常把他们放在同一台的主机上 ,这样就可以避免走网络请求
impalad 和datanode 经常在一起 ,为了数据本地化
Impalad
接收客户端的查询请求(接收查询请求的Impalad为Coordinator,Coordinator通过JNI调用java前端解释SQL查询语句,生成查询计划树,再通过调度器把执行计划分发给具有相应数据的其它Impalad进行执行),读写数据,并行执行查询,并把结果通过网络流式的传送回给Coordinator,由Coordinator返回给客户端。同时Impalad也与State Store保持连接,用于确定哪个Impalad是健康和可以接受新的工作。在Impalad中启动三个ThriftServer: beeswax_server(连接客户端),hs2_server(借用Hive元数据), be_server(Impalad内部使用)和一个ImpalaServer服务。每个impalad实例会接收、规划并调节来自ODBC或Impala Shell等客户端的查询。每个impalad实例会充当一个Worker,处理由其它impalad实例分发出来的查询片段(query fragments)。客户端可以随便连接到任意一个impalad实例,被连接的impalad实例将充当本次查询的协调者(Ordinator),将查询分发给集群内的其它impalad实例进行并行计算。当所有计算完毕时,其它各个impalad实例将会把各自的计算结果发送给充当 Ordinator的impalad实例,由这个Ordinator实例把结果返回给客户端。每个impalad进程可以处理多个并发请求。
Impala State Store
跟踪集群中的Impalad的健康状态及位置信息,由statestored进程表示,它通过创建多个线程来处理Impalad的注册订阅和与各Impalad保持心跳连接,各Impalad都会缓存一份State Store中的信息,当State Store离线后(Impalad发现State Store处于离线时,会进入recovery模式,反复注册,当State Store重新加入集群后,自动恢复正常,更新缓存数据)因为Impalad有State Store的缓存仍然可以工作,但会因为有些Impalad失效了,而已缓存数据无法更新,导致把执行计划分配给了失效的Impalad,导致查询失败。
- 用于协调各个运行impalad的实例之间的信息关系,Impala正是通过这些信息去定位查询请求所要的数据。换句话说,state store的作用主要为跟踪各个impalad实例的位置和状态,让各个impalad实例以集群的方式运行起来。
- 与 HDFS的NameNode不一样,虽然State Store一般只安装一份,但一旦State Store挂掉了,各个impalad实例却仍然会保持集群的方式处理查询请求,只是无法将各自的状态更新到State Store中,如果这个时候新加入一个impalad实例,则新加入的impalad实例不为现有集群中的其他impalad实例所识别(事实上,经笔者测试,如果impalad启动在statestored之后,根本无法正常启动,因为impalad启动时是需要指定statestored的主机信息的)。然而,State Store一旦重启,则所有State Store所服务的各个impalad实例(包括state store挂掉期间新加入的impalad实例)的信息(由impalad实例发给state store)都会进行重建。
CLI(Impala shell)
提供给用户查询使用的命令行工具(Impala Shell使用python实现),同时Impala还提供了Hue,JDBC, ODBC使用接口。该客户端工具提供一个交互接口,供使用者发起数据查询或管理任务,比如连接到impalad。这些查询请求会传给ODBC这个标准查询接口。说白了,就是一个命令行客户端。
与Hive的关系
####################################################################
impala 的 监控管理
1.配置信息 metrics
http://主机名:25020
2.元数据信息 catalog (也就是数据库 和表的信息 )
http://主机名:25010
#####################################################################
impala 的存储和分区
推荐parquent 文件类型 , snappy 的压缩格式
insert 可能或报错 , 可能是文件类型的原因 , 这个类型的insert 语法不支持
##################################################################
impala 比较重要的配置
statore
statore 的工作线程数 , 线程数越高 ,查询效率越高
impala Daemon 的内存的限制 , 官方128 G , 但是根据企业的服务器合理的配置 ,这个配置是我们单台的配置 ,是让总和加起来差不多64G 就行了
硬限制:实际分多少就是多少
软限制:有弹性的
#########################################################################
impala shell 外部shell
-h 帮助
impala-shell -h
-v 查询版本的信息 (查询的是impala 的版本)
impala-shell -v
注意:进入impala 的shell 后的version , 是查询的impala shell 的版本 ,impala和 impala shell 的版本不一致会出现问题
-V 启用详细的输出
impala-shell -V
注意: 查询的时候,列出硬件CPU , 内存的消耗等都会列出来
–quiet 关闭详细输出
-p 显示执行计划
impala-shell -p
注意:在执行sql 之前 ,需要消耗多少的运行资源
-i hostname (–impala=hostname) 指定链接主机
impala-shell -i hadoop2
格式hostname:port 默认端口21000
-r (–refresh_after_connect) 刷新所有的元数据 , 不要轻易的使用 ,尤其数据量大的时候 , 第一次同步hive 元数据的时候可以使用
impala-shell -r
catalog 同步hive 元数据的时候 ,不会同步建表的元数据
-q query(–query=query) 从命令行执行查询 , 不进入impala-shell
impala-shell -q “select * from user;”
-d 指定进入的库
impala-shell -d db2
注意: impala 中 ,default 数据库权限是最高的 , 默认会进入到default 数据库
-B (–delimited) 去格式化输出
–output_delimiter=character 指定分隔符
–print_header 打印列名
impala-shell -B –output_delimiter==,
-f query_file 执行查询文件 , 以分号分隔
-o filename 输出结果到指定的文件
impala-shell -f test.sql -o aa.txt
-c 查询执行失败时继续执行
sql 文件查询的时候 ,查询失败的时候回继续执行
-k 使用kerberos 安全加密方式运行impala-shell
-l 启用LDAP 认证
-u 启用LDAP 时 , 指定用户名
##########################################################################
impala shell 内部shell
help
connect <hostname:port> 链接主机 ,默认端口21000
refresh<增量刷新元数据库>
invalidate metadata 全量刷新元数据库 , 相当于外部shell 的-r , 消耗时间长
explain <sql> 显示sql 的查询计划 ,步骤信息
set explain_level 2 设置显示级别(0,1,2,3),越高查询计划越详细 ,一般工作设置成2
shell <shell> 不退出impla-shell 执行linux 命令 , 支持比较少 ,一般ls
profile (查询完成后执行 , 查询最近一次查询的底层信息 ,硬件资源消耗)
##########################################################################
impala sql 与 hive sql 的区别
impal 不支持 array , map , struct ,complex 不支持这几种数据类型(CDH5.5版本以后兼容 ,但是兼容性不好) ,如果要对hive 中这几种数据类型查询 ,需要转化中间表 ,然后进行查询
impala 不支持hive 的可扩展机制 ,例如 :Transform , 自定义文件格式
不支持XML , json 函数
不支持某些聚合函数:covar_pop , covar_samp ,corr , percentile , percentile_approx , histogram_numeric ,collect_set
impala 仅支持 avg , count , max , min , sum 函数
不支持多distinct 查询
不支持HDF ,UDAF
不支持一下语句:analyze table (Impala : compute stats) ; describe column ; describe database ; export table ; import table ; show table extended , show indexs , show columns
##########################################################################
impala sql
创建数据库
– create database db1;
– use db1;
删除数据库
– use default;
– drop database db1;
创建表(内部表)
– 默认方式创建表:
• create table t_person1(
• id int,
• name string
• )
– 指定存储方式:
• create table t_person2(
• id int,
• name string
• )
• row format delimited
• fields terminated by ‘\0’ (impala1.3.1版本以上支持‘\0’ )
• stored as textfile;
– 其他方式创建内部表
• 使用现有表结构:
• create table tab_3 like tab_1;
• 指定文本表字段分隔符:
• alter table tab_3 set serdeproperties
(‘serialization.format’=‘,’,’field.delim’=‘,’);
插入数据
– 直接插入值方式:
• insert into t_person values (1,hex(‘hello world’));
注意: 每插入一条数据 , 就会产生一个快 ,插入的很多的话 ,块就会很多 ,查询起来性能就会有所下降 ,如果真的有很多小文件的话 ,① 可以采用中间表的方式 ,把小的文件读出来,写入到中间表。 ② 使用load 的方式去加载
– 从其他表插入数据:
• insert (overwrite) into tab_3 select * form tab_2 ;
– 批量导入文件方式方式:
• load data local inpath ‘/xxx/xxx’ into table tab_1;
创建表(外部表)
– 默认方式创建表:
• create external table tab_p1(
• id int,
• name string
• )
• location ‘/user/xxx.txt’
– 指定存储方式:
• create external table tab_p2 like parquet_tab
• ‘/user/xxx/xxx/1.dat’
• partition (year int , month tinyint, day tinyint)
• location ‘/user/xxx/xxx’
• stored as parquet;
视图
– 创建视图:
• create view v1 as select count(id) as total from tab_3 ;
– 查询视图:
• select * from v1;
– 查看视图定义:
• describe formatted v1
• 注意:
– 1)不能向impala的视图进行插入操作
– 2) insert 表可以来自视图
##########################################################################
impala 的 数据文件处理
– 加载数据(过多小文件的处理方式2,3):
• 1、 insert语句:插入数据时每条数据产生一个数据文件,不建议用此方式
加载批量数据
• 2、 load data方式:再进行批量插入时使用这种方式比较合适
• 3、来自中间表:此种方式使用于从一个小文件较多的大表中读取文件并写
入新的表生产少量的数据文件。也可以通过此种方式进行格式转换。
– 空值处理:
• impala将“\n” 表示为NULL,在结合sqoop使用是注意做相应的空字段
过滤,
• 也可以使用以下方式进行处理:
• alter table name set tblproperties
(“serialization.null.format”=“null”)
##########################################################################
impala 与 Hbase 的整合
Impala可以通过Hive外部表方式和HBase进行整合,步骤如下:
步骤1 , 和步骤2 是hive 与 Hbase 的整合
步骤1,2,3 是impala 与Hbase 的整合 ,只是差了一个刷新元数据
• 步骤1:创建hbase 表,向表中添加数据
– create ‘test_info’, ‘info’
– put ‘test_info’,’1′,’info:name’,’zhangsan’
– put ‘test_info’,’2′,’info:name’,’lisi’
• 步骤2:创建hive表
– CREATE EXTERNAL TABLE test_info(key string,name string )
– ROW FORMAT SERDE ‘org.apache.hadoop.hive.hbase.HBaseSerDe’
– STORED by ‘org.apache.hadoop.hive.hbase.HBaseStorageHandler’
– WITH SERDEPROPERTIES (“hbase.columns.mapping”=”:key,info:name”)
– TBLPROPERTIES
– (“hbase.table.name” = “test_info”);
• 步骤3:刷新Impala表
– invalidate metadata
##########################################################################
impala 的 jdbc
• 配置:
– impala.driver=org.apache.hive.jdbc.HiveDriver
– impala.url=jdbc:hive2://node2:21050/;auth=noSasl
– impala.username=
– impala.password=
• 尽量使用PreparedStatement执行SQL语句:
– 1.性能上PreparedStatement要好于Statement
– 2.Statement存在查询不出数据的情况
##########################################################################
impala 的性能优化
• 执行计划
– 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的
详细方案
– 命令: explain sql、 profile
要点:
• 1、 SQL优化,使用之前调用执行计划 ( explain sql)
• 2、选择合适的文件格式进行存储 (parquent)
• 3、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间
表或者load)
• 4、使用合适的分区技术,根据分区粒度测算(例如日期)
• 5、使用compute stats进行表信息搜集
• 6、网络io的优化:
– a.避免把整个数据发送到客户端
– b.尽可能的做条件过滤
– c.使用limit字句
– d.输出文件时,避免使用美化输出(-B 去格式化输出)
• 7、使用profile输出底层信息计划,在做相应环境优化 (profile)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11885.html