impala 的笔记

#############################################################################

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值