Impala是Cloudera提供的⼀款开源的针对HDFS和HBASE中的PB级别数据进⾏交互式实时查询(Impala
速度快),Impala是参照⾕歌的新三篇论⽂当中的Dremel实现⽽来,其中旧三篇论⽂分别是
(BigTable,GFS,MapReduce)分别对应我们即将学的HBase和已经学过的HDFS以及MapReduce。
Impala最⼤卖点和最⼤特点就是快速,Impala中⽂翻译是⾼⻆羚⽺。
* Impala没有采取MapReduce作为计算引擎,MR是⾮常好的分布式并⾏计算框架,但MR引擎更多
的是⾯向批处理模式,⽽不是⾯向交互式的SQL执⾏。与 Hive相⽐:Impala把整个查询任务转为
⼀棵执⾏计划树,⽽不是⼀连串的MR任务,在分发执⾏计划后,Impala使⽤拉取的⽅式获取上个
阶段的执⾏结果,把结果数据、按执⾏树流式传递汇集,减少的了把中间结果写⼊磁盘的步骤,再
从磁盘读取数据的开销。Impala使⽤服务的⽅式避免 每次执⾏查询都需要启动的开销,即相⽐
Hive没了MR启动时间。
* 使⽤LLVM(C++编写的编译器)产⽣运⾏代码,针对特定查询⽣成特定代码。
* 优秀的IO调度,Impala⽀持直接数据块读取和本地代码计算。
* 选择适合的数据存储格式可以得到最好的性能(Impala⽀持多种存储格式)。
* 尽可能使⽤内存,中间结果不写磁盘,及时通过⽹络以stream的⽅式传递。
* Impala与Hive对⽐分析
* Hive:在Hive中,每个查询都有⼀个“冷启动”的常⻅问题。(map,reduce每次都要启动关闭,申
请资源,释放资源。。。)
* Impala:Impala避免了任何可能的启动开销,这是⼀种本地查询语⾔。 因为要始终处理查询,则
Impala守护程序进程总是在集群启动之后就准备就绪。守护进程在集群启动之后可以接收查询任
务并执⾏查询任务。
中间结果
* Hive:Hive通过MR引擎实现所有中间结果,中间结果需要落盘,这对降低数据处理速度有不利影
响。
* Impala:在执⾏程序之间使⽤流的⽅式传输中间结果,避免数据落盘。尽可能使⽤内存避免磁盘
开销
交互查询
* Hive:对于交互式计算,Hive不是理想的选择。
* Impala:对于交互式计算,Impala⾮常适合。(数据量级PB级)
计算引擎
* Hive:是基于批处理的Hadoop MapReduce
* Impala:更像是MPP数据库
容错
* Hive:Hive是容错的(通过MR&Yarn实现)
* Impala:Impala没有容错,由于良好的查询性能,Impala遇到错误会重新执⾏⼀次查询
查询速度
* Impala:Impala⽐Hive快3-90倍。
# Impala优势总结
* 1. Impala最⼤优点就是查询速度快,在⼀定数据量下;
* 2. 速度快的原因:避免了MR引擎的弊端,采⽤了MPP数据库技术,
* 1. Impala属于MPP架构,只能做到百节点级,⼀般并发查询个数达到20左右时,整个系统的吞吐已
经达到满负荷状态,在扩容节点也提升不了吞吐量,处理数据量在PB级别最佳。
* 2. 资源不能通过YARN统⼀资源管理调度,所以Hadoop集群⽆法实现Impala、Spark、Hive等组件
的动态资源共享。
* Hive: 复杂的批处理查询任务,数据转换任务,对实时性要求不⾼同时数据量⼜很⼤的场景。
* Impala:实时数据分析,与Hive配合使⽤,对Hive的结果数据集进⾏实时分析。impala不能完全取代
hive,impala可以直接处理hive表中的数据。
Impala的核⼼开发语⾔是sql语句,Impala有shell命令⾏窗⼝,以及JDBC等⽅式来接收sql语句执⾏,
对于复杂类型分析可以使⽤C++或者Java来编写UDF函数。
Impala的sql语法是⾼度集成了Apache Hive的sql语法,Impala⽀持Hive⽀持的数据类型以及部分Hive
的内置函数。
* 需要注意的⼏点:
1. Impala与Hive类似它们的重点都是在与查询,所以像Update,delete等具有更新性质的操作最好不
要使⽤这种⼯具,对于删除数据的操作可以通过Drop Table,Alter Table Drop Partition来实现,更
新可以尝试使⽤Insert overwrite⽅式
2. 通常使⽤Impala的⽅式是数据⽂件存储在Hdfs⽂件系统,借助于Impala的表定义来查询和管理
Hdfs上的数据⽂件;
3. Impala的使⽤⼤多数与Hive相同,⽐如Impala同样⽀持内外部表,以及分区等,可以借鉴参考
Hive的使⽤。
所谓的外部命令指的是不需要进⼊到impala-shell交互命令⾏当中即可执⾏的命令参数。impala-shell后
⾯执⾏的时候可以带很多参数。你可以在启动 impala-shell 时设置,⽤于修改命令执⾏环境。
impala-shell –h可以帮助我们查看帮助⼿册。也可以参考课程附件资料。
⽐如⼏个常⻅的:
impala-shell –r刷新impala元数据,与建⽴连接后执⾏ REFRESH 语句效果相同(元数据发⽣变化的时候)
impala-shell –f ⽂件路径 执⾏指的的sql查询⽂件。
impala-shell –i指定连接运⾏ impalad 守护进程的主机。默认端⼝是 21000。你可以连接到集群中运⾏
impalad 的任意主机。
impala-shell –o保存执⾏结果到⽂件当中去。
展示Impala默认⽀持的内置函数需要进⼊Impala默认系统数据库中执⾏
show functions;
** 在其它数据库下⽆法查看!!
所谓内部命令是指,进⼊impala-shell命令⾏之后可以执⾏的语法。
connect hostname 连接到指定的机器impalad上去执⾏。
invalidate metadata全量刷新,性能消耗较⼤,主要⽤于hive当中新建数据库或者数据库表的时候来进 ⾏刷新。
quit/exit命令 从Impala shell中退出
explain 命令 ⽤于查看sql语句的执⾏计划。
explain的值可以设置成0,1,2,3等⼏个值,其中3级别是最⾼的,可以打印出最全的信息
set explain_level=3;
profile命令执⾏sql语句之后执⾏,可以 打印出更加详细的执⾏步骤,主要⽤于查询结果的查看,集群的调优等。
expalin:可以不真正执⾏任务,只是展示任务的执⾏计划;
profile:需要任务执⾏完成后调⽤,可以从更底层以及更详细的层⾯来观察我们运⾏impala的任务,进 ⾏调优。
CREATE DATABASE语句⽤于在Impala中创建新数据库。
CREATE DATABASE IF NOT EXISTS database_name;
这⾥,IF NOT EXISTS是⼀个可选的⼦句。如果我们使⽤此⼦句,则只有在没有具有相同名称的现有数 据库时,才会创建具有给定名称的数据库。
默认就会在hive的数仓路径下创建新的数据库名⽂件夹
/user/hive/warehouse/lagoutest.db
Impala的DROP DATABASE语句⽤于从Impala中删除数据库。 在删除数据库之前,建议从中删除所有 表。
如果使⽤级联删除,Impala会在删除指定数据库中的表之前删除它。
drop database sample cascade;
CREATE TABLE语句⽤于在Impala中的所需数据库中创建新表。 需要指定表名字并定义其列和每列的数 据类型。
impala⽀持的数据类型和hive类似.
create table IF NOT EXISTS database_name.table_name ( column1 data_type,
column2 data_type, column3 data_type, ……… columnN data_type);
CREATE TABLE IF NOT EXISTS my_db.student(name STRING, age INT, contact INT );
默认建表的数据存储路径跟hive⼀致。也可以在建表的时候通过location指定具体路径。