impala学习

|

一、==impala==架构

https://www.cloudera.com/products/open-source/apache-hadoop/impala.html

http://impala.apache.org/

cloudera公司:提供对HDFS、HBase数据的高性能、低延迟的交互式sql查询功能。

基于Hive使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。

是CDH平台首选的PB级别大数据实时查询分析引擎。

  • 计算性能对比图:

1、impala的优势

  • 基于Hive使用内存计算(数据存储在Hive中),能够对PB级数据进行交互式实时查询分析
  • 无需转换成MR,直接读取HDFS数据
  • 基于C++编写,LLVM统一编译运行
  • 兼容HiveSQL
  • 具有数据仓库的特性,可以直接对Hive数据做数据分析
  • 支持Data Local(数据本地化,移动计算)
  • 支持列式存储(如HBase)
  • 支持JDBC/ODBC远程访问(ODBC:Windows端控制面板搜索:数据源)

2、impala的劣势

  • 内存依赖大
  • C++编写,部分开源
  • 完全依赖Hive做sql解析
  • 实践过程中,分区数超过1W时,性能严重下降
  • 稳定性不如Hive

3、安装方式

  • ClouderaManager (CDH)
  • 手动安装比较麻烦

4、组件

  • Statestore Daemon
    • 实例:statestored
    • 负责收集在集群中各个impala进程的资源信息、各节点健康状况,同步节点信息
    • 负责query的调度
  • Catalog Daemon
    • 实例:catalogd
    • 分发表的元数据信息到各个impala中
    • 接收来自statestore的所有请求
  • Impala Daemon
    • 实例:impalad
    • 接收client 、hue 、 jdbc/odbc请求、query执行并返回给中心协调节点
    • 子节点上的守护进程,负责和statestore保持通信,汇报工作

Query Planner :

查询计划,有缓存效果

Query Coordinator

分发查询任务

Query Excutor

执行查询任务

5、impala shell

进入交互式界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
##外部项
impala shell -h ##显示impala的帮助信息
impala shell -v ##显示impala的版本信息
impala shell -V ##启用详细输出
impala shell --quiet ##关闭详细输出
impala shell -p ##开启显示详细执行计划
impala shell -i hostname(--impalad=hostname) ##指定连接主机,默认端口21000
impala shell -r(--refresh after connect) ##刷新所有元数据,可以快一点查看如新创建的表
impala shell -q query(--query=query) ##在命令行执行查询,不进入impala shell中,相当于 hive -e "select * from tb"
impala shell -d default_db(--database=default_db) ##指定数据库
impala shell -B(--delimited) ##去格式化输出,用于外部执行sql时,标准输出到指定文件中时,去格式化后的数据更适用于其他业务需要,没有多余的字符
* --output delimited=chatactor ##指定分隔符
* --print_header ##打印列名
impala shell -f query_file(query_file=query_file) ##执行查询文件,以分号分隔
impala shell -o filename(--output_file filename) #将结果输出到指定文件 类似于 >
impala shell -c ##查询执行失败时继续执行 与 -f 组合使用
impala shell -k(--kerberos) ##使用kerberos安全加密方式运行impala-shell
kerberos -l ##启用LDAP认证
kerberos -u ##启用LDAP时,指定用户名

开启LDAP认证模式:

进入交互式界面:

  • impala中的sql语句读取的数据是来自Hive中的
  • 在内部项中使用sql,用 ;(分号) 结束每个语句。
1
2
3
4
5
6
7
8
9
10
###内部项
help ## 进入帮助界面
connect node01 ##connect <hostname:port> 连接其他主机服务器,默认端口21000
refresh <tablename> ##增量刷新元数据库
invalidate metadata ##全量刷新元数据库
explain <sql> ##显示查询计划 、 步骤信息
set explain level 设置显示级别 (0,1,2,3)
shell <shell> ##不退出impala-shell而执行Linux命令 ,相当于Hive中的!
profile ##打印最近一次的查询计划的信息
<sql> ## 内部输入sql语句

二 、 impala监控管理

Web UI

  • 查看StateStore(状态信息,只配置在一台节点上,impala)

http://node00:25010

  • 查看Catalog

http://node00:25020

三、impala的存储和分区

1、存储

2、压缩

需要压缩的情况:

  • 网络IO时
  • 资源可能一段时间不用时

3、分区

与Hive类似

  • Hive中分区表在创建表的时候,就需要指定分区字段,之后可以动态添加分区,但是如果是非分区表,之后是不能添加分区字段。
  • 动态分区的字段与普通字段相比,相当于伪列,占用空间小

4、impala中支持的数据类型

complex : 复数

5、impala中不支持的类型

  • 自定义序列化反序列化:(例:Hive中导入Json文件)

  • 不支持自定义函数

四、Impala SQL

  • 创建数据库
1
2
create database db1;
use db1;
  • 删除数据库
1
2
use default;
drop database db1;
  • 创建表(内部表:存储在配置的默认路径中)

    默认方式创建表:

    1
    2
    3
    4
    create table t_b1(
    id int,
    name string
    )

    指定存储方式创建表:

    1
    2
    3
    4
    5
    6
    7
    create table t_b2(
    id int,
    name string
    )
    row format delimited
    fields terminated by '\0' --(impala 1.3.1版本以上支持)
    stored as textfile;

    其他方式创建内部表:

    1
    2
    3
    4
    5
    --使用现有表结构
    create table t_b3 like t_b2;
    --指定文本表字段分隔符
    alter table t_b3 set serdeproperties
    ('serialization.format' = ',','field.delim' = ',');
  • 插入数据

    • 直接插入数据
    1
    insert into t_b3 values(1,hex('hello world'));
    • 从其他表插入数据
    1
    insert (overwrite) into  t_b3 select * from t_b2;
    • 批量导入文件
    1
    load data local inpath '/xxx/xxx' into table t_b3;
  • 创建表(外部表:需指定存储路径)

​ 默认方式

1
2
3
4
5
create external table t_b4(
id int,
name string
)
location '/user/xxxx.txt';

指定存储方式

1
2
3
4
5
6
7
8
create external t_b4 like parquet_tbl '/user/xxx/1.dat'
partition (
year int,
month tinyint,
day tinyint
)
location 'user/xxx/xxx.txt'
stored as parquet;

视图:(简化查询语句,封装sql,提高数据安全性)

  • 创建视图
1
create view v1 as select countidas total from t_b1;
  • 查询视图
1
select * from v1;
  • 查看视图定义
1
describe formatted v1;

注意note:

  • 不能向impala的视图进行插入操作
  • insert表可来自视图
  • 数据文件处理

加载数据:

  • insert语句:插入数据时每条数据产生一个数据文件(不建议加载批量数据,如果遇到需要一条一条插入数据的业务场景时,可借助Hbase)
  • load data方式:推荐应用于批量数据插入时
  • 来自中间表:适用于从一个小文件较多的大表中读取文件并写入新的表产生少量的数据文件。也可适用于进行格式转换

空值处理:

  • impala将 ‘\n’ 表示为NULL ,在结合sqoop使用时注意做相应的空字段过滤
  • 也可用一下方式处理:
1
2
> alter table tb1 set tblpropertites ("serialization.null.format" = "null");
>

五、impala整合Hbase

Impala可通过Hive外部表方式和Hbase整合,步骤如下:

1、创建Hbase表,向表中添加数据

1
2
3
4
create 'tb_test','info'

put 'tb_test','1','info:name','zhangsan'
put 'tb_test','2','info:name','lisi'

2、在Hive中创建外部表

1
2
3
4
5
6
7
8
create external table tb_test(
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"="tb_test");

3、刷新impala表

1
2
3
4
##外部项 
impal-shell -r
##内部项
invalidate metadata;

注意可能报错:impala中查询表中数据时,报错无法获得Hbase表的信息

解决方案 ,配置完后,记得重启CDH集群

六、impala和JDBC整合

数据库接口标准:JDBC

  • 配置:
    – impala.driver=org.apache.hive.jdbc.HiveDriver
    – impala.url=jdbc:hive2://node2:21050/;auth=noSasl
    – impala.username=
    – impala.password=

  • 尽量使用PreparedStatement执行SQL语句:
    – 1.性能上PreparedStatement(ps)要好于Statement,ps可以有缓存,执行预加载,性能优
    – 2.Statement存在查询不出数据的情况,ps可以使用占位符 , 防止sql注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 {
//加载Hive驱动
Class.forName("org.apache.hive.jdbc.HiveDriver");
//创建连接 :数据库url , 用户名 , 密码
Connection conn =
//21050 是impalad的端口 ,因为auth=noSasl 所以可以不用密码 DriverManager.getConnection("jdbc:hive2://node04:21050/test;auth=noSasl",
"",
"");
//创建sql的预处理块
PreparedStatement pstm =
conn.prepareStatement("select id,type,level from sales limit 50");
//预处理快执行查询操作,得到查询结果
ResultSet rs = pstm.executeQuery();

while (rs.next()) {
System.out.println(rs.getString(1) + " " +
rs.getString("type") + " " +
rs.getString("level"));
}

rs.close();
pstm.close();
conn.close();
}
}

七、impala性能优化

  • 执行计划 ,(查看执行计划,便于性能优化)
    – 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案
    – 命令:explain sql (级别默认为1)、profile (查询最后一次执行计划)

  • 要点:
    • 1、SQL优化,使用之前调用执行计划

    • 2、选择合适的文件格式进行存储

    • 3、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表)

    • 4、使用合适的分区技术,根据分区粒度测算 (分区数膨胀速度 ; 分区内的数据)

    • 5、使用compute stats进行表信息搜集

    1
    2
    3
    4
    5
    6
    7
    8
    9
    --impala 内部:
    > show table stats tb_test;

    > show column stats tb_test;

    --执行优化分析
    > compute stats tb_test;

    再执行查询就会快很多

    显示表的信息

    #Rows #File Size Bytes Cached Cache Replication Format Incremental stats

    显示表中字段的信息

    Column Type #Distinct Values #Nulls Max Size Avg Size

    • 6、网络io的优化:
    ​ – a.避免把整个数据发送到客户端(避免select * )
    ​ – b.尽可能的做条件过滤
    ​ – c.使用limit字句
    ​ – d.输出文件时,避免使用美化输出 (impal-shell -B 去格式化)

    • 7、使用profile输出底层信息计划,在做相应环境优化

注意note:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
------------------------------------------------------------
Hive函数:
analyse table
over (开窗函数)
------------------------------------------------------------
Null : 在Hive中不占空间,在MySql中占空间;
Hive允许有稀疏
------------------------------------------------------------
Hive中查看表信息
hive> desc tablename;(表的字段信息)
hive> desc formatted tablename;(表的非常详细的信息)
hive>show tables from databasename;(impala不支持)
------------------------------------------------------------
CDH搭建无法找到JAVA_HOME问题
su username 使用该命令要保证在/home/路径下用户的目录
将java的配置在全局环境变量中
------------------------------------------------------------
CDH环境中启动hive会遇到权限问题
解决方案: su - hdfs
-------------------------------------------------------------
mysql 授权:
grant all on *.* to 'temp'@'CDH-NODE-01' identified by 'temp' with grant option
(库名)(库的连接名) (用户名)
------------------------------------------------------------
hive建表语句中
stored as textfile 指定在hive中保存的文件格式,保存在HDFS上
导入数据到hive中
附加方法:
先创建指定格式的表
将本地满足表的格式的数据文件,加载到表所在的HDFS路径下
------------------------------------------------------------
HBase的rowkey设计原则:
* 唯一性
* 定长 : 满足2的次幂(与计算机的位处理有关)
* 越短越好: 64KB
若设计过长,影响数据存储的利用率,数据有价值的部分在value中
* 散列原则: 数据均匀分布在不同的服务器上
* 取反 (连贯的情况)
* 取hash
* 拼接随机前缀
* 取模有点危险
文章目录
  1. 一、==impala==架构
  2. 二 、 impala监控管理
  3. 三、impala的存储和分区
    1. 1、存储
    2. 2、压缩
    3. 3、分区
    4. 4、impala中支持的数据类型
    5. 5、impala中不支持的类型
  4. 四、Impala SQL
  5. 五、impala整合Hbase
  6. 六、impala和JDBC整合
  7. 七、impala性能优化
|
载入天数...载入时分秒...