Impala是Cloudera公司主导研发的高性能、低延迟的交互式SQL查询引擎,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据。Impala主要用于解决Hadoop生态圈无法支持交互式查询数据的痛点,Impala是CDH平台首选的PB级大数据实时交互式查询分析引擎
2015年11月,Cloudera将Impala捐赠给了Apache基金会,2017年11月,Impala从Apache孵化器毕业。以前在文档中称为Cloudera Impala的地方,现在已经正式更名为Apache Impala
Impala是一个基于Hive、分布式、大规模并行处理(Massively Parallel Processing,MPP)的数据库引擎。除了使用相同的统一存储平台外,Impala还使用与Apache Hive相同的元数据、SQL语法(Hive SQL)、ODBC驱动程序和用户界面(Hue)
Impala开源,使用C++和Java编写,号称是性能最高的SQL引擎(提供类似RDBMS的体验),提供了访问存储在Hadoop分布式文件系统中的数据的最快方法。Impala直接针对存储在HDFS、HBase或S3中的Apache Hadoop数据提供快速的交互式SQL查询
MPP是一种基于PostgreSQL的分布式数据库,采用Shared-Nothing架构,主机、操作系统、内存、存储都是自我控制的,不存在共享。在MPP集群中,每个节点都有独⽴的内存和磁盘,每个节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务
简单来说,MPP是将任务并⾏的分散到多个服务器节点上,在每个节点上计算完成后,将各⾃部分的结果汇总在⼀起得到最终的结果
MPP虽然是关系型数据库产品,但它与Hadoop的理论基础是很相似的:都是将任务分布到节点中独立运算后进行结果合并。只不过MPP底层跑的是SQL,而Hadoop底层执行的是MapReduce
Impala是对现有大数据查询工具的补充。Impala不会替代基于MapReduce构建的批处理框架Hive,Hive和基于Spark框架查询的Hive最适合长时间运行的批处理作业。例如,涉及提取、转换和加载(ETL)类型作业的批处理
Impala是参照Google的Dremel系统进行设计的。Dremel是Google的交互式数据分析系统,它构建于Google的GFS(Google File System)等系统之上,支撑了Google的数据分析服务BigQuery等诸多服务
Dremel的技术亮点主要有两个:一是实现了嵌套型数据的列存储;二是使用了多层查询树,使得任务可以在数千个节点上并行执行和聚合结果
列存储可以减少查询时处理的数据量,有效提升查询效率。Dremel的列存储针对的并不是传统的关系数据,而是嵌套结构的数据。Dremel可以将一条条的嵌套结构的记录转换成列存储形式,查询时根据查询条件读取需要的列,然后进行条件过滤,输出时再将列组装成嵌套结构的记录输出,记录的正向和反向转换都通过高效的状态机实现
另外,Dremel的多层查询树则借鉴了分布式搜索引擎的设计。查询树的根节点负责接收查询,并将查询分发到下一层节点,底层节点负责具体的数据读取和查询执行,然后将结果返回上层节点
Impala其实就是Hadoop的Dremel,Impala使用的列存储格式是Parquet,但不仅仅支持Parquet格式,同时也可以直接处理文本、SequenceFile等Hadoop中常用的文件格式
使用Impala,用户可以使用传统的SQL知识以极快的速度处理存储在HDFS、HBase和Amazon S3中的数据,而无需了解Java(MapReduce作业)
另外,由于是在数据驻留(在Hadoop集群上)时执行数据处理,因此在使用Impala时,不需要对存储在Hadoop上的数据进行数据转换和数据迁移
Impala优点:
Impala缺点:
MapReduce是非常好的并行计算框架,但它更多的面向批处理模式,而不是面向交互式的SQL执行
与MapReduce相比,Impala把整个查询任务转为⼀棵执⾏计划树,而不是一连串的MapReduce任务。在分发执行计划后,Impala使用拉式(拉取)获取数据的方式获取上个阶段的执⾏结果,把结果数据按执行树流式传递汇集,减少了把中间结果写磁盘、再读磁盘的开销。Impala使用服务的方式避免每次执行查询都需要启动的开销,即相比Hive没了MapReduce的启动时间
一个关键原因是,Impala为每个查询产生汇编级的代码,当Impala在本地内存中运行的时候,这些汇编代码执行效率比其它任何代码框架都更快,因为代码框架会增加额外的延迟
Impala VS Hive
如下:
相同点:
不同点:
Map->Shuffle->Reduce...
,一个Query会被编译为多轮MapReduce,每个中间结果都存在I/O开销,效率较低;Impala将执行计划转化为一棵完整的执行计划树,在执⾏程序之间使⽤流的⽅式传输中间结果,避免数据落盘,尽可能使⽤内存避免磁盘开销,效率高