数据库按照应用场景划分可以分为OLTP和OLAP,OLTP是针对交易型的场景比如像银行的存取款、转账类业务,OLAP是针对分析型的场景比如用于企业决策支持的BI、报表类业务。
而在OLAP领域,又可以根据具体技术实现分为MOLAP及ROLAP。MOLAP是基于多维分析的OLAP系统,一般对存储有优化,进行部分预计算,查询性能最高,但查询灵活性有限制。ROLAP是更偏向传统关系型的OLAP系统,ROLAP又分为两类:一类是MPP数据库,另一类是SQL引擎。MPP数据库是完整的数据库,一般需要把数据导入到库中进行OLAP分析,入库时对数据分布进行优化,进而获得后期查询性能的提升,提供灵活的即席查询能力,但无法支持超大数据量的查询。SQL引擎只提供SQL执行能力,不负责具体的数据存储。
目前主流的开源OLAP产品按照此分类主要有以下产品:

以下针对以上几种开源组件分别进行概要的介绍说明,并进行相关特性的对比。
Apache Kylin™是一个开源的、分布式的分析型数据仓库,提供 Hadoop 之上的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc.开发并贡献至开源社区。Kylin的核心思想是预计算,理论基础是:以空间换时间。即将多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube并存储到HBase中,供查询时直接访问。把高复杂度的聚合运算,多表连接等操作转换成对预计算结果的查询。最新版本的Apache Kylin4.0采用了全新的 Spark 构建引擎和 Parquet 作为存储,同时使用 Spark 作为查询引擎。
Kylin的架构图如下:

优点:
缺点:
Apache Druid是高性能的实时分析数据库,主要提供对大量的基于时序的数据进行OLAP查询能力。支持毫秒级的快速的交互式查询。Druid的核心设计结合了数据仓库、时间序列数据库和搜索系统的思想,适用于多种场景的高性能数据实时分析。
Druid的架构图如下:
优点:
缺点:
对比Kylin:
GreenPlum是基于PostgreSQL的开源MPP数据库,具有良好的线性扩展能力,具有高效的并行运算和并行存储特性。
GreenPlum的架构图如下:

优点:
缺点:
ClickHouse是Yandex(号称俄罗斯的百度)开源的MPP架构的列式存储数据库。在 ClickHouse 中,数据始终是按列存储的,包括矢量(向量或列块)执行的过程。只要有可能,操作都是基于矢量进行分派的,而不是单个的值,这被称为«矢量化查询执行»,它有利于降低实际的数据处理开销。
ClickHouse的特点有:
ClickHouse的架构图如下:

优点:
缺点:
Cloudera公司推出,提供对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能。 基于Hive,使用内存计算,兼顾数据仓库、具有实时、批处理、多并发等优点。是CDH平台首选的PB级大数据实时查询分析引擎。
Impala架构如下:

优点:
缺点:
HAWQ是Pivotal公司开源的一个Hadoop原生大规模并行SQL分析引擎,针对的是分析型应用。Apache HAWQ 采用主从(Master-Slave)的改进MPP架构,通过将MPP与批处理系统有效的结合,克服了MPP的一些关键的限制问题,如短板效应、并发限制、扩展性等。其整体架构与Pivotal另一开源MPP数据库Greenplum比较相似:

优点:
缺点:
Presto是Facebook推出分布式SQL交互式查询引擎,完全基于内存的并行计算,支持任意数据源,数据规模GB~PB。
它采用典型的master-slave架构,架构图如下:

优点:
缺点:
对比Hive:
Hive默认采用MapReduce,MR每个操作要么需要写磁盘,要么需要等待前一个stage全部完成才开始执行,而Presto将SQL转换为多个stage,每个stage又由多个tasks执行,每个tasks又将分为多个split。所有的task是并行的方式进行允许,stage之间数据是以pipeline形式流式的执行,数据之间的传输也是通过网络以Memory-to-Memory的形式进行,没有磁盘io操作。这也是Presto性能比Hive快很多倍的决定性原因。

对比Spark:
Drill是MapR开源的一个低延迟的大数据集的分布式SQL查询引擎,是谷歌Dremel的开源实现。它支持对本地文件、HDFS、HBASE等数据进行数据查询,也支持对如JSON等schema-free的数据进行查询。
Drill的架构图如下:

从架构上看,与同是源自Dremel的Impala比较类似。
优点:
缺点:
Spark SQL与传统 DBMS 的查询优化器 + 执行器的架构较为类似,只不过其执行器是在分布式环境中实现,并采用的 Spark 作为执行引擎。Spark SQL 的查询优化是Catalyst,Catalyst 将 SQL 语言翻译成最终的执行计划,并在这个过程中进行查询优化。这里和传统不太一样的地方就在于, SQL 经过查询优化器最终转换为可执行的查询计划是一个查询树,传统 DB 就可以执行这个查询计划了。而 Spark SQL 最后执行还是会在 Spark 内将这棵执行计划树转换为 Spark 的有向无环图DAG 再执行。

优点:
缺点:
Hive是一个构建于Hadoop顶层的数据仓库工具。定义了简单的类似SQL 的查询语言——HiveQL,可以将HiveQL查询转换为MapReduce 的任务在Hadoop集群上执行。

优点:
缺点:
针对这几款开源OLAP组件的性能,网上有一份相关的对比测试报告,这里引用https://blog.csdn.net/oDaiLiDong/article/details/86570211中的测试情况进行补充说明。整体来说,这个性能对比测试是一个TPC-DS的标准测试,是针对Hadoop(2.7)、Hive(2.1)、Hawq(3.1.2.0)、Presto(0.211)、Impala(2.6.0)、Sparksql(2.2.0)、Clickhouse(18.1.0-1.El7)、Greenplum(5.7.0) 具体版本进行的。采用多表关联和单大表性能分别对比不同组件在查询性能、系统负载等方面的情况。环境是采用的一个三节点的物理机,操作系统为CentOS7。
测试的结果如下表格所示:
结论:多表关联查询场景,Presto、Impala、Hawq、GreePlum性能较好,是SparkSQL和Clickhouse性能的2-3倍。(Hive是性能最差的,与前几个组件不是同一个数据级的差别)


结论:单表查询场景,Clickhouse性能比较突出,是其它组件的3-6倍。这其中,Hawq、GreenPlum在单表查询的场景性能要更差一些。


整体上总结就是,Presto、Impala以及Hawq在多表查询方面体现出了优势,虽说Presto和Impala在多表查询方面的性能差别不大,但是在查询过程中却发现Impala的一些局限性,并尽量避开这些局限问题进行测试。Impala不支持的地方,例如:不支持update、delete操作,不支持Date数据类型,不支持ORC文件格式等等,而Presto则基本没有这些局限问题(本次测试中基本没有发现)。
在单表测试方面clickhouse体现出了比其余组件的优势,性能比其他组件要好一大截,而presto相比于hawq和impala以及sparksql在单大表聚合操作方面的表现也相对优秀。
针对上述各开源产品的描述及性能对比,我们使用下面表格来对这些产品进行一个较全面的对比,
| Druid | Kylin | Greenplum | ClickHouse | Impala | Hawq | Presto | Drill | Hive | SparkSQL | |
|---|---|---|---|---|---|---|---|---|---|---|
| 分类 | MOLAP | MOLAP | ROLAP | ROLAP | ROLAP | ROLAP | ROLAP | ROLAP | ROLAP | ROLAP |
| 架构 | 预计算 | 预计算 | MPP数据库 | MPP数据库 | SQL引擎 | SQL引擎 | SQL引擎 | SQL引擎 | SQL引擎 | SQL引擎 |
| 依赖Hadoop | 否 | 是 | 否 | 否 | 是 | 是 | 否 | 是 | 是 | 是 |
| 事务支持 | 否 | 否 | 是 | 否 | 否 | 是 | 否 | 否 | 否 | 否 |
| SQL功能支持 | 有限 | 有限 | 完善 | 有限 | 有限 | 完善 | 有限 | 有限 | 有限 | 有限 |
| 支持更新 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 | 不支持 | 不支持 |
| 优点 | 超大数据集支持 | 超大数据集支持 | 完善的数据库产品,适合用于企业级数仓 | 单表查询性能极佳 | 多表关联性能不错 | Hadoop之上的事务支持 | 整体性能不错,支持多数据源 | 支持多数据源 | 可靠性较高 | 融合SQL与Spark |
| 缺点 | 灵活性差 | 灵活性差 | 单机故障导致木桶效应 | 多表关联性能不佳 | 查询内存占用大 | 不适合单表复杂聚合操作 | 容错性不强,纯内存操作,内存放不下会报错 | GC问题 | 延迟较高 | 多表单表性能都不突出 |