背景
Impala是一个SQL on Hadoop的MPP查询引擎,由Cloudera主导开发并捐献给Apache软件基金会,在2017年底正式孵化成为Apache顶级项目。
如图,大数据领域里的OLAP系统种类繁多,它们各自有自己的特长和局限性,需要根据实际业务场景合理进行选择。存储方式往往决定了系统的能力和兼容性,跟据存储方式我们可以把它们分为三大类:
不存储原始数据,只保留聚合结果,如Druid、Kylin等
存储计算一体,自己实现存储层,如Greenplum、Clickhouse、Doris(原Baidu Palo)等
存储计算分离,依托HDFS、S3等实现存储层,这类系统又可以细分为两类:
使用自定义的文件格式,如HAWQ、VectorH等
使用开源文件格式,如Hive、Impala、Presto、SparkSQL、Drill等
第1类系统不保留原始数据,可以把性能做得很高,但由于聚合方式需要事先定义,比较适合报表类业务等查询模式相对固定的场景。当需要明细查询或交互式的灵活查询(Adhoc查询)时,仍需要另两类系统的加入才能支持。
第2类系统自己管理数据,可以做很多定制的优化,从而也能达到较高的性能。但由于数据没法与其它系统共享,往往需要将已有数据重新导入一次,在引入时需要考虑迁移成本以及多存一份数据的代价,因此一般在新建数仓中被考虑使用。第3.a类系统虽然依托外部存储,但因为采用封闭的文件格式,仍需要多存一份数据,其地位其实与第2类相同,常常在新建数仓时才被考虑。
使用最广的还是属于3.b类的系统,主要原因是基于Hadoop的数仓使用广泛,此类系统不需要重新生成一份数据,能与已有架构充分兼容。在此类系统中,Impala、Presto、Drill属于MPP(Massively Parallel Processing)系统,各节点流式地在内存中完成计算,中间数据几乎不落盘,相比Hive、SparkSQL等批处理系统能达到极高的性能。
在Hadoop生态圈的MPP系统中,Impala具有优异的性能,它的优势缘于:
C++实现,相比Presto、Drill等Java实现要更高效,也省去了Java GC的开销
基于LLVM的Code Generation,能根据实际数据类型生成高效的执行代码
CBO (Cost Based Optimizer),基于各表的统计信息得出代价最低的执行计划
缓存元数据,生成执行计划时不再需要和Hive、HDFS进行交互
RuntimeFilter,在运行时基于已读的小表数据裁剪大表需要扫描的数据量
Predicate/Aggregation Pushdown,虽然MPP系统都会有下推优化,但支