impala详解

0 简介

Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和**HBase**中的PB级大数据。已有的Hive系统虽然也提供了SQL语义,但由于Hive底层执行使用的是MapReduce引擎,仍然是一个批处理过程,难以满足查询的交互性。相比之下,Impala的最大特点也是最大特点就是它的快速!

简单概括impala的主要作用:

mpala最大的特点就是可以使用自己的处理引擎来使用SQL分析HIVE,HDFS中的数据 , 处理速度更加高效!!!

1 读取hbase和hdfs和hive映射的数据

2 impala依赖hive  共享元数据  , impala的表和hive的表可以同步

3 impala支持窗口函数和自定义函数

4 支持SQL , 比hive快

1.什么是Impala:

Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。 它是一个用C ++和Java编写的开源软件。 与其他Hadoop的SQL引擎相比,它提供了高性能和低延迟。

换句话说,Impala是性能最高的SQL引擎(提供类似RDBMS的体验),它提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。

2.impala的优点和缺点:

2.1 优点:

1) Impala不需要把中间结果写入磁盘,省掉了大量的I/O开销。

2) 省掉了MapReduce作业启动的开销。MapReduce启动task的速度很慢(默认每个心跳间隔是3秒钟),Impala直接通过相应的服务进程来进行作业调度,速度快了很多。

3) Impala完全抛弃了MapReduce这个不太适合做SQL查询的范式,而是像Dremel一样借鉴了MPP并行数据库的思想另起炉灶,因此可做更多的查询优化,从而省掉不必要的shuffle、sort等开销。

4) 通过使用LLVM来统一编译运行时代码,避免了为支持通用编译而带来的不必要开销。

5) 用C++实现,做了很多有针对性的硬件优化,例如使用SSE指令。

6) 使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销 

2.2 缺点:

1) Impala不提供任何对序列化和反序列化的支持。

2) Impala只能读取文本文件,而不能读取自定义二进制文件。

3) 每当新的记录/文件被添加到HDFS中的数据目录时,该表需要被刷新

3.impala的功能:

1.Impala可以根据Apache许可证作为开源免费提供。

2.Impala支持内存中数据处理,它访问/分析存储在Hadoop数据节点上的数据,而无需数据移动。

3.Impala为HDFS中的数据提供了更快的访问。

4.可以将数据存储在Impala存储系统中,如Apache HBase和Amazon s3。

5.Impala支持各种文件格式,如LZO,序列文件,Avro,RCFile和Parquet。

6.使用impala,您可以使用传统的SQL知识以极快的速度处理存储在HDFS中的数据。

7.由于在数据驻留(在Hadoop集群上)时执行数据处理,因此在使用Impala时,不需要对存储在Hadoop上的数据进行数据转换和数据移动。

8.使用Impala,您可以访问存储在HDFS,HBase和Amazon s3中的数据,而无需了解Java(MapReduce作业)。您可以使用SQL查询的基本概念访问它们。

9.为了在业务工具中写入查询,数据必须经历复杂的提取 - 变换负载(ETL)周期。但是,使用Impala,此过程缩短了。加载和重组的耗时阶段通过新技术克服,如探索性数据分析和数据发现,使过程更快。

 

 4.impala的外部shell

4.1 impala中shell常用的一些内部命令

refresh+表名   增量刷新元数据库(指定某张表的数据进行刷新)

invalidate metadata:全量刷新元数据库(慎用,刷新所有表)(同于 impala-shell -r)

explain select * from student  查看sql的执行计划 主要用于优化sql;

impala登陆web页面:http://主机名:8888

5. hive和impala中的数据类型的

 6.impala创建分区表的方法:

create table stb_par(
id int, 
name string
)
partitioned by (month string)
row format delimited fields terminated by '\t';
-- 添加分区 
alter table stb_par add partition (month='202010');
alter table stu_par add partition (month='202011') partition (month='202012');
-- 删除分区
alter table stu_par drop partition (month='202011');
-- 查看表中的分区
[localhost:21000] default> show  partitions  stb_par ;
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| month  | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                                  |
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| 202010 | -1    | 0      | 0B   | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://doit:8020/user/hive/warehouse/stb_par/month=202010 |
| Total  | -1    | 0      | 0B   | 0B           |                   |        |                   |                                                           |
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
load data local inpath '/data/stu.txt' into table stb_par partition(month='202010') ; -- 不支持本地导入数据
load data  inpath '/data/stu.txt' into table stb_par partition(month='202010') ; --只能从HDFS上导入数据到分区表中
insert into table stb_par partition (month = '202010') select id , name from stb_par;
[localhost:21000] default> show  partitions stb_par ;
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| month  | #Rows | #Files | Size | Bytes Cached | Cache Replication | Format | Incremental stats | Location                                                  |
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+
| 202010 | -1    | 2      | 36B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://doit:8020/user/hive/warehouse/stb_par/month=202010 |
| 202011 | -1    | 1      | 36B  | NOT CACHED   | NOT CACHED        | TEXT   | false             | hdfs://doit:8020/user/hive/warehouse/stb_par/month=202011 |
| Total  | -1    | 3      | 72B  | 0B           |                   |        |                   |                                                           |
+--------+-------+--------+------+--------------+-------------------+--------+-------------------+-----------------------------------------------------------+

 

6.1 impala和hive细节上的区别:

1. 基本的语法跟 hive 的查询语句大体一样

2. Impala 不支持 CLUSTER BY, DISTRIBUTE BY, SORT BY

3. Impala 中不支持分桶表

4. Impala 不支持 COLLECT_SET(col)和 explode(col)函数

5. Impala 支持开窗函数  over()  row_number()  rank()  lag  lead

7.impala导入数据的五种方式:

1 location 指定表的位置 文件夹 , 文件夹中有数据 直接加载

2 据直接put到表目录下 

3 load data inpath '' into table partition(col='valu')   加载HDFS中的数据

4 insert  into tb select  from   --插入的方式导入数据

5 create table tb_name as select from  查询一张表的结果,导入创建好的表中

导出数据的方法

[root@hadoop103 ~]# impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

[root@hadoop103 ~]# cat output.txt 

1001 tignitgn

1002 yuanyuan

1003 haohao

1004 yunyun

Impala 不支持 export 和 import 命令

 

8. 格式化数据 

8.1 格式化文本文件数据

这个常用于我们实际生产当中的格式化CSV文件,场景:给定一个csv文件,将csv文件导入到impala表中,并且文件中第一行数据有字段,需要跳过第一行或者前几行;

create table a(id int , name string) row format delimited fields terminated by ',' stored as textfile ;
-- 将Text文本格式的数据导入到对应的表目录中
--hdfs dfs -put a.txt  /user/hive/warehouse/a/
 refresh a ; -- 刷新表
 select * from a ;
+----+------+
| id | name |
+----+------+
| 1  | wy   |
| 2  | ly   |
| 3  | hy   |
+----+------+
alter table header_line set tblproperties('skip.header.line.count'='1'); --去除每个文件的第一行数据 也就是去除文件头信息

 

8.2 格式化Parquet 文件数据

create table tb_p  stored as  Parquet as select * from a ;  -- tb_p文件夹中的数据是Parquet格式
/user/hive/warehouse/tb_p/000000_0
CREATE EXTERNAL TABLE tb_pppp LIKE PARQUET '/user/hive/warehouse/tb_p/000000_0'  --这个路径是用来映射表结构的
STORED AS PARQUET  --指定存储文件的类型
location '/user/hive/warehouse/tb_p/';   --这个路径指的是表要从哪里加载数据
[doita:21000] db_demo> select * from tb_pppp ;
+----+------+
| id | name |
+----+------+
| 3  | ww   |
| 22 | bb   |
| 2  | lss  |
| 11 | aa   |
| 33 | cc   |
| 1  | zss  |
+----+------+

 

9.impala整合hive的使用细节 

10. impala整合hbase的使用细节 

场景:impala读取hbase中的数据,我们先通过hive整合hbase中的数据,将hbase中的数据整合到hive中,然后在通过impala和hive中的数据是共享的原则,用impala去读取hive表的数据,从而达到需求,impala整合hbase中的数据

1 在hbase中创建一张表

create 'tb_hbase' , 'cf'

 2.在hive中创建一张表整合hbase中表的数据

CREATE EXTERNAL TABLE tb_hbase (
  id string,
  name string,
   age int
 )
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'  --这个值得是固定的类
WITH SERDEPROPERTIES (
  "hbase.columns.mapping" =
  ":key,cf:name,cf:age"    --这里id对应的是行键,不用写,后面值得是列族,对应的属性
)
TBLPROPERTIES("hbase.table.name" = "tb_hbase");  --值得是表名,注意表名一定要和hbase中的表名一致,因为hive要和hbase整合

3.在impala中同步hive表数据

INVALIDATE METADATA; --刷新元数据

4.在impala中可以查询到hive中的表数据信息

[doita:21000] default> select * from tb_hbase ;

注意:在impala中也可以往hbase中插入数据;只要是impala整合hbase中的表就可以;

 

常用命令总结:

1. refresh+表名           增量刷新元数据库(指定某张表的数据进行刷新)

2. invalidate metadata:    全量刷新元数据库(慎用,刷新所有表)(同于 impala-shell -r)

3. explain select * from student    查看sql的执行计划 主要用于优化sql

4. SHOW TABLE STATS  + 表名     --数据在底层存储的特点 位置大小文件个数 文件格式

5.细节,impala只支持从hdfs上导入数据,不支持从本地导入数据 ******

6.导入数据的方式 ****

 

 

©️2020 CSDN 皮肤主题: 数字50 设计师:CSDN官方博客 返回首页