一、什么是Impala
• Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。
• 基于Hive使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点
• 是CDH平台首选的PB级大数据实时查询分析引擎
二、Impala特点
• 1、基于内存进行计算,能够对PB级数据进行交互式实时查询、分析
• 2、无需转换为MR,直接读取HDFS数据
• 3、C++编写,LLVM统一编译运行
• 4、兼容HiveSQL
• 5、具有数据仓库的特性,可对hive数据直接做数据分析
• 6、支持Data Local
• 7、支持列式存储
• 8、支持JDBC/ODBC远程访问
三、Impala缺点
• 1、对内存依赖大
• 2、C++编写 , 虽然是开源的,但相信很对JAVA开发者看起来还是相对艰难的
• 3、完全依赖于hive
• 4、实践过程中 分区超过1w 性能严重下下降
• 5、稳定性不如hive
四、Impala安装在CDH上
4.1安装方式
之前也说过新增服务,这里具体就跳过了
4.2安装后效果
五、Impala核心组件介绍
• Statestore Daemon
– 负责收集分布在集群中各个impalad进程的资源信息、各节点健康状况,同步节点信息.
– 负责query的调度
• Catalog Daemon
– 分发表的元数据信息到各个impalad中
– 接收来自statestore的所有请求
• Impala Daemon
– 接收client、hue、jdbc或者odbc请求、Query执行并返回给中心协调节点
– 子节点上的守护进程,负责向statestore保持通信,汇报工作
六、Impala架构
七、Impala Shell
在CDH上安装完成Impala后,登录任意一台服务器,执行 impala-shell 便可以进入Impala shell命令界面。
• -h (--help) 帮助
• -v (--version) 查询版本信息
• -V (--verbose) 启用详细输出
• --quiet 关闭详细输出
• -p 显示执行计划
• -i hostname (--impalad=hostname) 指定连接主机,格式hostname:port 默认端口21000
• -r(--refresh_after_connect)刷新所有元数据
• -q query (--query=query) 从命令行执行查询,不进入impala-shell
• -d default_db (--database=default_db) 指定数据库
• -B(--delimited)去格式化输出
• --output_delimiter=character 指定分隔符
• --print_header 打印列名
• -f query_file(--query_file=query_file)执行查询文件,以分号分隔
• -o filename (--output_file filename) 结果输出到指定文件
• -c 查询执行失败时继续执行
• -k (--kerberos) 使用kerberos安全加密方式运行impala-shell
• -l 启用LDAP认证
• -u 启用LDAP时,指定用户名
特殊用法:
• help
• connect <hostname:port> 连接主机,默认端口21000
• refresh <tablename> 增量刷新元数据库
• invalidate metadata 全量刷新元数据库
• explain <sql> 显示查询执行计划、步骤信息
• set explain_level 设置显示级别(0,1,2,3)
• shell <shell> 不退出impala-shell执行Linux命令
• profile (查询完成后执行) 查询最近一次查询的底层信息
八、Impala 监控管理
九、Impala 存储&& 分区
• 压缩方式
• 添加分区方式
– 1、partitioned by 创建表时,添加该字段指定分区列表
– 2、使用alter table 进行分区的添加和删除操作
• create table t_person(id int, name string, age int) partitioned by (type string);
• alter table t_person add partition (sex=‘man');
• alter table t_person drop partition (sex=‘man');
• alter table t_person drop partition (sex=‘man‘,type=‘boss’);
• 分区内添加数据
– insert into t_person partition (type='boss') values (1,’zhangsan’,18),(2,’lisi’,23)
– insert into t_person partition (type='coder') values (3,wangwu’,22),(4,’zhaoliu’,28),(5,’tianqi’,24)
• 查询指定分区数据
– select id,name from t_person where type=‘coder’
十、Impala SQL VS HiveQL
• 支持数据类型:
– INT
– TINYINT
– SMALLINT
– BIGINT
– BOOLEAN
– CHAR
– VARCHAR
– STRING
– FLOAT
– DOUBLE
– REAL
– DECIMAL
– TIMESTAMP
• CDH5.5版本以后支持以下类型:
– ARRAY
– MAP
– STRUCT
– Complex
• 此外,Impala不支持HiveQL以下特性:
– 可扩展机制,例如:TRANSFORM、自定义文件格式、自定义SerDes
– 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 INDEXES、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’));
– 从其他表插入数据:
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 表可以来自视图
• 数据文件处理
– 加载数据:
• 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:创建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
package com.pirlo.impala;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class impalaClient {
public static void main(String[] args) throws Exception {
Class.forName("org.apache.hive.jdbc.HiveDriver");
// Impala默认端口 21050
Connection conn = DriverManager.getConnection("jdbc:hive2://node2:21050/;auth=noSasl", "", "");
// 建议使用性能更好的preparedstatement
PreparedStatement pstm = conn.prepareStatement("select page_url, ip from page_view limit 6");
ResultSet rs = pstm.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1) + " " + rs.getString("page_url"));
}
rs.close();
pstm.close();
conn.close();
}
}
十四、Impala性能优化
要点:
• 1、SQL优化,使用之前调用执行计划
• 2、选择合适的文件格式进行存储
• 3、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表)
• 4、使用合适的分区技术,根据分区粒度测算
• 5、使用compute stats进行表信息搜集
• 6、网络io的优化:
– a.避免把整个数据发送到客户端
– b.尽可能的做条件过滤
– c.使用limit字句
– d.输出文件时,避免使用美化输出
• 7、使用profile输出底层信息计划,在做相应环境优化