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.导入数据的方式 ****