1、1 概述 1. Impala是参照谷歌新三篇论文Dremel的开源实现,和Shark、Drill功能相似。Impala是Cloudera公司主导开发并开源。基于Hive并使用内存进行计算,兼顾数据仓库,具有实时、批处理、多并发等优点。是使用CDH的首选PB级大数据实时查询分析引擎。 2. Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的子集,功能还在不断的完善中。 1.1 特点 1. 基于内存进行计算,
2、能够对PB级数据进行交互式实时查询、分析 2. 摒弃了MR计算改用C++编写,有针对性的硬件优化,例如使用SSE指令 3. 兼容HiveSQL,无缝迁移 4. 通过使用LLVM来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。 5. 支持sql92标准,并具有自己的解析器和优化器。 6. 具有数据仓库的特性,对hive原有数据做数据分析。 7. 使用了支持Data locality的I/O调度机制。 8. 支持列式存储。 9. 支持jdbc/odbc远程访问。 1.2 缺点 1. 基于内存进行计算,对内存依赖性较大 2. 改用C++编写 ,意味着对C++普
3、通用户不可见。 3. 基于Hive,与Hive共存亡 4. 实践中impala的分区数超过一万,性能严重下降,容易出现问题。 5. 稳定性不如Hive。 2 配置 共分为三种角色:Impala Catalog Server、Impala Daemon、Impala StateStore: 注:Impala没有主节点, Impala Catalog Server和Impala StateStore具有主节点的功能,可当作主节点,Impala Daemon可理解为从节点 Ø 配置impala的内存,impala需要内存的是Impala Daemon,Impal
4、a提供查询实例的是 Impala Daemon,Impala的总内存就是Impala Daemon的内存总和,如果要在某台机器做汇总操作,该台机器内存需要大一些 Ø Impala的客户端可以连Impala Daemon的任意一台机器,但做汇总操作可以连内存大的Impala Daemon的机器 Ø 如果每台机器的内存大小相差不大时,可以轮询Impala Daemon的机器,或随机进行切换(获取机器的资源,如果某台机器的资源多,就使用这台机器发请求),可解决线程的问题和返回数据内存的问题,也可解决高并发问题。 配置State Store的工作线程数,一般会给的高一些,给高后会快一些
5、 3 Impala三大核心主件 1. Statestore daemon:服务名StateStore 1) 负责收集分布在集群中各个impalad进程的资源信息,各节点健康状况、同步节点信息。检查Daemon是否活着 2) 负责query的调度. 3) 对于一个正常运转的集群,并不是一个关键进程. 2. Catalog daemon:服务名Catalog: 1) 把impala表的metadata(也是hive的源数据表)分发到各个impalad中 2) 接收来自statestore的所有请求 3. Impala daemon:服务名impalad: 1) 接收client
6、hue、jdbc或者odbc请求、query 执行并返回给中心协调节点 2) 子节点上的守护进程,负责向statestore保持通信,汇报工作 注:插入数据在Daemon上操作,操作后汇报给StateStore说明节点的数据变了,StateStore发请求给Catalog,Catalog去同步源数据表,StateStore进程和Catalog进程经常放到一台机器上。建议不要在StateStore进程和Catalog进程的机器上安装Daemon。 4 Impala架构 1 client发出请求到impalad上(impalad可以是随机的),impalad可以相互通信 2
7、 catalog与hive的Metastore进行通信,随时拿源数据,拿到的源数据再分发到各个impalad上 3 impalad搭建在datanode上,因为数据就在这上面,可直接进行操作,实现数据操作本地化 4 impalad包括三个主键: Query Planner:执行计划的生成,把sql解析成执行计划 Query Coordinator:中心协调节点,根据执行计划,将执行的任务分发到每一台机器, Query Executor:具体来执行任务 5 impalad执行完后,返回给client 5 impala shell 外部命令
8、 5.1 impala-shell -h 万能帮助 5.2 impala-shell -r刷新整个元数据 * 说明:不光刷新表结构,表内的数据也会刷新出来(包括增删改的数据),不建议使用这个命令定时刷新,如果表较多时,这个刷新需要很长时间,不得以的时候可以做整体刷新 1) 在hive中创建表test 2) 在impala中查看表,看不到hive内创建的表 3) 刷新impala源数据 4) 查看impala内的表 5) 删除impala内的test表 6) 查看hive内的表,发现hive内的表也被删除了 5.3 impala-shell -B
9、去格式化 说明:查询大数据量时可以提高性能 子命令: impala-shell -B --print_header 去格式化时显示列名 impala-shell -B --output_delimiter 指定分隔符 1) 查看impala内的表,发现表外面有框,这就是被格式化的 2) 去格式化 3) 去格式化时显示列名 在hive内查询数据 在impala内查询 5.4 impala-shell -v查看版本 查看impala shell的版本 注:如果在impala升级时,发现impala和impala shell的版本不一
10、致时说明升级有问题。 5.5 impala-shell -f 执行查询文件 * 子命令: --query_file 指定查询文件 1. 执行查询文件 $ vi test select * from test limit 5; $ impala-shell -f test 2. 使用子命令查询文件 3. 使用子命令查询结果去格式化 注:测试些处用impala-shell -B --print_header -f test.sss命令是否能执行成功 5.6 impala-shell -i连接到对应的impalad 说明:如果在某台服务器上未
11、安装impalad服务,可以连接其他服务器的impalad服务 子命令: --impalad 指定impalad去执行任务 --fe_port 指定备用端口 5.7 impala-shell -o保存执行结果到文件 * 子命令: --output_file 指定输出文件名 1. 保存执行结果到文件 注:测试些处用impala-shell –o result.txt -f test.sss命令是否能执行成功 2. 查询结果去格式化,执行test.sss文件,结果保存在result.ex内 注:测试些处用impala-shel
12、l -B --print_header –o result.txt -f test.sss命令是否能执行成功 3. 查询结果去格式化,不显示列名,执行test.sss文件,结果保存在result.ex内 5.8 impala-shell -u 指定某一用户运行impala-shell 子命令: --user 指定用户执行shell命令 --ssl 通过ssl验证方式方式执行 --ca_cert 指定第三方用户证书 --config_file 临时指定配置文件 注:上面未配置kerberos,因此没有用户
13、权限控制 5.9 impala-shell -p 显示执行计划 子命令: --quiet 不显示多余信息 以上先显示执行结果,再显示执行计划 如果执行计划显示的结果较多,可以写到文件中 5.10 impala-shell -d指定进入某一个数据库 子命令: --database 指定数据库名称 5.11 其他命令 Ø q 不进入impala-shell执行查询 Ø -k 使用kerberos安全加密方式运行impala-shell Ø -c 忽略错误语句继续执行 Ø -l 使用LDAP协议进行访
14、问
6 Impala shell 内部命令
6.1 help帮助选项
6.2 version 查看impala版本
6.3 connect连接到某个impalad实例
connect
15、录查询不到
4. 在imapla中刷新该表
6.5 invalidate metadata 全量刷新,性能消耗较大 *
1. 外部命令impala-shell -r就是调用内部命令invalidate metadata
2. 在hive内创建表
3. 此时在impala内查不到该表
4. 在impala内全量刷新
5. 此时在show tables;可以查看在hive内创建的表
6.6 explain显示一个查询的执行计划及各步骤信息 *
explain
16、1. 使用执行计划
files 表示读取几个文件, size 表示读取多大的文件
2. 设置执行计划的级别,set explain_level,共四个级别,分别是0、1、2、3
1) 设置3级,最高级别
2) 设置0级,最低级别
6.7 shell
17、令profile 可以查看那台机器使用的内存 7 Impala的管理 Ø Impala StateStore Web UI (hadoop01):StateStore的web界面 Ø StateStore:用于统计集群的健康信息、同步节点信息 Catalog:用于和集群的原数据信息进行同步 显示有那些数据库,那些表 8 Impala存储 Hive能支持的数据类型,impala都能支持 Parquet:impala支持特别的格式,Parquet格式是列工存储 推荐用snappy压缩 9 Imp
18、ala分区 Ø 添加分区方式: 1、partitioned by:创建表时,添加该字段指定分区列表 2、使用alter table 进行分区的添加和删除操作 create table tab_p0(id int, name string, age int ) partitioned by (year int); Ø 向分区内插入数据: insert into tab_p0 partition (year=2014) values (1,’zhangsan’,18),(2,’lisi’,23) insert into tab_p0 pa
19、rtition (year=2015) values (3,wangwu’,22),(4,’zhaoliu’,28),(5,’tianqi’,24) 注:只有Parquet、Text可以使用impala加载数据,其他格式需要在hive中加载数据 Ø 查询指定分区数据: select name from tab_p0 where year = 2015; 10 Impala sql 内部表删除后会把数据都删了,外部表删除后不会删除数据 1. 创建表(内部表) Ø Impala创建的内部表源数据也会写到hive内,hdfs目录为/user/hive/warehouse
20、Ø 如何区分hive和impala创建的表,前面用户是impala就是impala创建的表,其他用户创建的是hive的表 Ø 默认方式创建表: create table tab_1( id int, value string ) Ø 指定存储方式: 1) create table tab_2( id int, value string ) row format del
21、imited fields terminated by ‘\0’ (impala1.3.1版本以上支持‘\0’ ) stored as textfile; 2) create table parquet_table_name(x INT, y STRING) STORED AS PARQUET; Ø 其他方式创建内部表 使用现有表结构: create table tab_3 like tab_1; 指定文本表字段分隔符: alter table tab_3 set serdeproperties (‘se
22、rialization.format’=‘,’,’field.delim’=‘,’); Ø 插入数据 直接插入值方式: insert into tab_2 values (1,hex(‘hello world’)); 从其他表插入数据: insert (overwrite) into tab_3 select * form tab_2 ; 批量导入文件方式方式: load data local inpath ‘/xxx/xxx’ into table tab_1; 2. 创建表(外部表) Ø 默认方式创建
23、表: create external table tab_p1( id int, value string ) location ‘/user/xxx.txt’ Ø 指定存储方式: create external table tab_p2 like parquet_tab ‘/user/xxx/xxx/1.dat’ partition (year int , month tinyint, day tinyin
24、t) location ‘/user/xxx/xxx’ stored as parquet; 3. 视图 Ø 创建视图: create view v1 as select count(id) as total from tab_3 ; Ø 查询视图: select * from v1; Ø 查看视图定义: describe formatted v1 Ø 注意: 1)不能向impala的视图进行插入操作 2)insert 表可以来自视图(从视图查询出数据
25、insert到一张表里) 11 数据文件处理 Ø 加载数据: 1、insert语句:插入数据时每条数据产生一个数据文件,不建议用此方式加载批量数据 2、load data方式:再进行批量插入时使用这种方式比较合适(在hive中load data完,在impala中进行插入)(parquet在hive中不能创建,在impala中创建parquet格式的表,在hive的一个表插入数据,在impala中刷新出来就有两张表了,一张是impala创建的parguet表,一张是从hive中刷新出来的业务数据,从有数据的hive表查询出来插入到impala的pargu
26、et表) 3、来自中间表:此种方式使用于从一个小文件较多的大表中读取文件并写入新的表生产少量的数据文件。也可以通过此种方式进行格式转换。 Ø 空值处理: impala将“\n”表示为NULL,在结合sqoop使用是注意做相应的空字段过滤, 也可以使用以下方式进行处理: alter table name set tblproperties (“serialization.null.format”=“null”) 12 impala与hbase整合 Impala可以通过Hive外部表方式和HBase进行整合,步骤如下: Ø 步骤1:创建hbase 表,向表中
27、添加数据 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 ) STORED by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapp
28、ing"=":key,info:name") TBLPROPERTIES ("hbase.table.name" = "test_info"); Ø 步骤3:刷新Impala表 invalidate metadata (注:hbase里在增加数据,impala不能刷新,直接就能查出来) 13 impala与jdbc整合 package cn.crxy.impala; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement
29、 import java.sql.ResultSet; /** * Created by xd on 2015/8/19. */ public class TestJDBC { public static void main(String[] args) throws Exception { Class.forName("org.apache.hive.jdbc.HiveDriver"); Connection conn = DriverManager.getConnection("jdbc:hive2://119.90.51.
30、195:21050/;auth=noSasl","",""); PreparedStatement pstm = conn.prepareStatement("select count(*) from impala.bigdata limit 1"); ResultSet rs = pstm.executeQuery(); while(rs.next()){ System.out.println(rs.getString(1)); } rs.close(); p
31、stm.close(); conn.close(); } } 注:119.90.51.195可以是任意一台impalad服务器的ip 14 性能优化 1. 执行计划 所谓执行计划,即在查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案: 命令:exlpain sql 和 profile 2. 性能优化要点 1) SQL优化,使用之前调用执行计划 2) 选择合适的文件格式进行存储 3) 避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表) 4) 使用合适的分区技术,根据分区粒度测算 5) 使用compute stats进行表信息搜集 6) 网络io的优化: a.避免把整个数据发送到客户端 b.尽可能的做条件过滤 c.使用limit字句 d.输出文件时,避免使用美化输出 7) 使用profile输出底层信息计划,在做相应环境优化






