您的位置:首页 > 大数据

大数据CDH之Impala_10_02

2017-10-21 14:43 405 查看

Impala简介

Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。
基于Hive使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点是CDH平台首选的PB级大数据实时查询分析引擎.
http://www.cloudera.com/products/apache-hadoop/impala.html http://www.impala.io/index.html


Impala 优势

1、基于内存进行计算,能够对PB级数据进行交互式实时查询、分析

2、无需转换为MR,直接读取HDFS数据

3、C++编写,LLVM统一编译运行

4、兼容HiveSQL

5、具有数据仓库的特性,

     可对hive数据直接做数据分析

6、支持Data Local

7、支持列式存储

8、支持JDBC/ODBC远程访问.





Impala 劣势

1、对内存依赖大

2、C++编写  开源?!

3、完全依赖于hive

4、实践过程中  分区超过1w  性能严重下降  

5、稳定性不如hive

安装方式

1、ClouderaManager
2、手动安装



Impala的安装需要依赖 HDFS、YARN、Zookeeper、Hive

Impala 核心组件





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

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 监控管理

查看StateStore http://node1:25020/ 查看Catalog http://node1:25010/

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



此外,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查询

UDF、UDAF

以下语句:

ANALYZE TABLE (Impala:COMPUTE STATS)、DESCRIBE COLUMN、DESCRIBE DATABASE、EXPORT TABLE、IMPORT TABLE、SHOW TABLE EXTENDED、SHOW INDEXES、SHOW COLUMNS、

创建数据库

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 * from 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整合

mpala可以通过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

配置:

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优化,使用之前调用执行计划

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

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

4、使用合适的分区技术,根据分区粒度测算

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

6、网络io的优化:

a.避免把整个数据发送到客户端

b.尽可能的做条件过滤

c.使用limit字句

d.输出文件时,避免使用美化输出

7、使用profile输出底层信息计划,在做相应环境优化
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: