MapReduce、Hive和Impala之间的发展历程是这样的:MapReduce->Hive->Impala。
官方一点的解释:
Impala是一个开源的基于内存的快速查询分析引擎。
他可以直接使用Hive的Metastore,也就是说Hive中创建的表,Impala可以直接使用;并且兼容HiveSQL,但是不是100%兼容,大部分的SQL语法都是兼容的。
Impala的优点
- 1:基于内存运算,中间结果不落盘,节省大量的I/O开销;因为在MapReduce任务中,Map阶段产生的中间结果需要先写磁盘,再通过Shuffle拷贝到Reduce阶段,所以会产生大量的I/O,因此计算效率不如Impala。
- 2:底层计算引擎由C++编写,通过LLVM统一编译运行,效率更高。LLVM是一个编译器。注意了,Impala底层的计算引擎没有使用大数据生态圈中的计算框架,它是自己单独实现的。
- 3:兼容HiveSQL语法,学习成本低,容易上手。ImpalaSQL支持SQL92标准,并具有自己的解析器和优化器。SQL92是数据库的一个ANSI标准,HiveSQL也支持SQL92标准。
- 4:兼容Hive的Metastore,可以直接使用Hive中的表。
- 5:支持数据本地化(Data Locality)特性,提高计算效率。其实就是说Impala支持数据本地计算,前提是impala的服务需要和HDFS的datanode节点部署在一起。
- 6:支持列式存储数据格式,可以和HBase整合。也就是说Impala可以通过SQL计算HBase中的数据。
- 7:支持多种文件格式,例如:TextFile、SequenceFile、RCFile、ORC和Parquet。其实只要是Hive支持的数据格式,目前Impala都是支持的。
- 8:支持ODBC/JDBC远程访问,这样就可以无缝对接到Web项目,在页面操作起来更方便。
Impala的缺点
- 1:基于内存进行计算,对内存依赖性较大。基于内存计算,既是优点,也是缺点。
- 2:使用C++编写,意味着维护难度增加,相对而言,Java程序维护起来比较简单。
- 3:分区数量超过一万,性能严重下降,容易出现问题。主要还是因为它是基于内存计算,单个SQL任务计算的数据量过大,对内存依赖就很大了,所以容易出现问题。
- 4:基于Hive,与Hive共存亡。因为Impala需要使用Hive的Metastore来存储元数据信息。
- 5:稳定性不如Hive。主要也是因为Impala是基于内存的,所以稳定性相对来说一般。
Impala + Hive
Impala和Hive之间的关系从这个图里面可以比较清晰的进行了解
最底层是HDFS,接着是MapReduce、Hive对MapReduce做了封装,提供了SQL支持。
Hive的元数据信息存储在Metastore中,Metastore我们一般是使用MySQL。
Impala自己使用C++实现了一套分布式计算引擎,也可以直接操作HDFS中的数据,并且和Hive共享一个Metastore。
Impala三大核心组件
Impala架构中主要包含三大核心组件:
- Impala daemon:简称为impalad,它是Impala集群中的核心守护进程,需要在多个节点启动,一般会和DataNode节点部署在一起;他主要负责向Statestore保持通信,汇报工作。同时负责接收客户端的请求,执行查询,并把结果返回给客户端。
- Statestore daemon:简称为statestored,他主要负责收集集群中各个Impalad进程的资源信息、各节点健康状况、同步节点信息,以及负责Query的协调调度。
- Catalog daemon:简称为catalogd,他主要负责分发表的元数据信息到各个Impalad中,以及接收来自Statestore的所有请求。
这个图里面包含了客户端、Hive Metastore、HDFS NameNode、HDFS DataNode、HBase以及Impala中的Statestore、Catalog、Impalad这三个核心组件。
其中Hive Metastore是负责维护Impala元数据信息的,HDFS和HBase都是可以作为Impala底层数据存储的组件。
客户端向Impala发送请求时的整个执行流程是这样的:
(1)客户端向某一个Impalad发送一个Query(SQL)。
(2)Impalad将Query解析为具体的Planner(执行计划), 然后交给当前机器的Coordinator(中心协调节点)。
(3)Coordinator根据Planner,通过本机的Executor执行,并转发给其他有数据的Impalad。
(4)多个Impalad的Executor之间会进行通信,可能需要一些数据的处理。
(5)各个Impalad的Executor执行完成后,会将结果返回给Coordinator。
(6)由Coordinator将汇聚的查询结果返回给客户端。