云计算·大数据 频道

主流开源OLAP引擎大比拼

  构建大数据平台,少不了要和各种开源OLAP引擎打交道,那么这么多引擎,用户该如何选择呢?我们先来了解下什么是OLAP,和OLTP有哪些区别,开源OLAP引擎有哪些主流赛道?

  为了满足数据运营的精细化要去,企业在做数据分析时,通常会分OLAP(On-line Analytical Processing,联机分析处理)、OLTP(OnlineTransactionProcessing联机事务处理)。OLAP是基于数据仓库多维模型的基础上实现的面向分析的各类操作的集合,也是此次汇总的重点;而OLTP是传统关系型数据库的应用技术,提供日常的、基本的事务处理,比如在线交易之类。

  之后,随着数据技术的发展,OLAP又分ROLAP和MOLAP(Multidimension OLAP,简称MOLAP)。ROLAP是联机分析处理(OLAP)的一种,是关系性数据库,但是针对多维报表,可以通过事实表连维表的方式来构造,它对存储在关系数据库(而非多维数据库)中的数据作动态多维分析。MOLAP,严格遵照Codd的定义,自行建立了多维数据库,来存放联机分析系统数据,开创了多维数据存储的先河,后来的很多家公司纷纷采用多维数据存储。

  而从数据仓库这个角度看,大概可以分为五个进化阶段。一代的数据仓库,是传统的共享存储架构数据仓库,比如Oracle、IBM等。第二代,MPP数仓开始出现,这个时候的核心技术就是Hive,解决的是离线数仓的高并发问题。之后,第三代在线数仓技术出现,也就是Hadoop数仓阶段,典型的技术包括SparkSQL、Presto、Impala、Drill、HAWQ。第四代,实时数仓走向MPPDB阶段,出现了Doris、Clickhouse、Greenplum等。与此同时,OLAP另外一个细分赛道正在孵化,出现了MOLAP,具体技术是Kylin、Druid。第五代,是流式计算框架开始出现,Flink开始深入流批一体实践中。

  综上所述,不同企业业务场景不同,发展阶段不同,采取的技术路线不同,使用的OLAP引擎也不一样。要想让数据处理能力、灵活程度和性能上做到优中之优,需要根据自己的需求进行选型。比如:具体可根据不同引擎的响应时间、并发、支持的数据量、SQL支持、实时查询、去重、存储、易用性等方面综合衡量。

  本文全面汇总了开源OLAP引擎,按照各种引擎出现的背景以及业务特点进行了大概分类,仅供参考。

  1、Hive

  Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。

  Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。

  2、 SparkSql

  Spark SQL 是 Spark 处理结构化数据的程序模块。是基于Spark平台上的一个OLAP框架,基本思路是增加机器来并行计算,从而提高查询速度。它将 SQL 查询与 Spark 程序无缝集成,可以将结构化数据作为 Spark 的 RDD 进行查询。RDD 的全称为 Resilient Distributed Datasets,即弹性分布式数据集,是 Spark 基本的数据结构。Spark 使用 RDD 作为分布式程序的工作集合,提供一种分布式共享内存的受限形式。RDD 是只读的,对其只能进行创建、转化和求值等操作。

  SparkSQL作为Spark生态的一员继续发展,而不再受限于Hive,只是兼容Hive。我们利用hive作为数据源,spark作为计算引擎,通过SQL解析引擎,实现基于hive数据源,spark作为计算引擎的SQL测试方案。

  SparkSQL是Hadoop中另一个著名的SQL引擎,它以Spark作为底层计算框架,Spark使用RDD作为分布式程序的工作集合,它提供一种分布式共享内存的受限形式。在分布式共享内存系统中,应用可以向全局地址空间的任意位置进行读写操作,而RDD是只读的,对其只能进行创建、转化和求值等操作。这种内存操作大大提高了计算速度。SparkSql的性能相对其他的组件要差一些,多表单表查询性能都不突出。

  3、 Presto

  Presto是一个开源的分布式SQL查询引擎,适用于交互式分析查询,数据量支持GB到PB字节,Presto虽然具备解析SQL的能力,但它并不属于标准的数据库范畴。

  Presto支持在线数据查询,包括Hive,关系数据库以及专有数据存储。一条Presto查询可以将多个数据源的数据进行合并,可以跨越整个组织进行分析,Presto主要用来处理响应时间小于1秒到几分钟的场景。

  Presto查询引擎是基于Master-Slave的架构,运行在多台服务器上的分布式系统,由一个Coordinator节点和多个Worker节点组成,Coordinator负责解析SQL语句,生成执行计划,分发执行任务给Worker节点执行,Worker节点负责实际执行查询任务。

  presto 是 Facebook 开源的大数据查询引擎,为了解决 hive 查询慢产生。使用 java 编写,数据全部在内存中处理。Presto没有使用MapReduce,大部分场景下比Hive快一个数量级,其中的关键是所有的处理都在内存中完成。

  presto主要特征是:

  原生集成了 Hive、Hbase 和关系型数据库;

  需要与现场确认是否能提供;

  提供 jdbc 接口和 sql 执行引擎,可以与现有系统集成。

  Presto是一个分布式SQL查询引擎,它被设计为用来专门进行高速、实时的数据分析。它支持标准的ANSI SQL,包括复杂查询、聚合(aggregation)、连接(join)和窗口函数(window functions)。作为Hive和Pig(Hive和Pig都是通过MapReduce的管道流来完成HDFS数据的查询)的替代者,Presto本身并不存储数据,但是可以接入多种数据源,并且支持跨数据源的级联查询。Presto是一个OLAP的工具,擅长对海量数据进行复杂的分析;但是对于OLTP场景,并不是Presto所擅长,所以不要把Presto当做数据库来使用。

  Presto综合性能比起来要比其余组件好一些,无论是查询性能还是支持的数据源和数据格式方面都要突出一些,在单表查询时性能靠前,多表查询方面性能也很突出。由于Presto是完全基于内存的并行计算,所以presto在查询时占用的内存也不少,但是发现要比Impala少一些,比如多表join需要很大的内存,Impala占用的内存比presto要多。

  4、 Impala

  impala 是 Cloudera 开发并开源的,能查询存储在 HDFS 和 HBase 中的数据。同 Hive 一样,也是一种 SQL on Hadoop 解决方案。但 Impala 抛弃了 MapReduce,使用更类似于传统的 MPP 数据库技术来提高查询速度。

  Impal基于内存运算,速度快,支持的数据源没有Presto多,主要特征是:

  impala 可以直接查询 hdfs 或 hbase 上的数据,可以与现有的存储无缝对接;

  impala 需要单独安装,公司内 paas 主推。需要与现场确认;

  impala 提供 jdbc 接口和 sql 执行引擎,可以与现有系统集成。

  Impala 是 Cloudera 在受到 Google 的 Dremel 启发下开发的实时交互SQL大数据查询工具,它拥有和Hadoop一样的可扩展性、它提供了类SQL(类Hsql)语法,在多用户场景下也能拥有较高的响应速度和吞吐量。它是由Java和C++实现的,Java提供的查询交互的接口和实现,C++实现了查询引擎部分。

  除此之外,Impala还能够共享Hive Metastore,甚至可以直接使用Hive的JDBC jar和beeline等直接对Impala进行查询、支持丰富的数据存储格式(Parquet、Avro等)。此外,Impala 没有再使用缓慢的 Hive+MapReduce 批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由 Query Planner、Query Coordinator 和 Query Exec Engine 三部分组成),可以直接从 HDFS 或 HBase 中用 SELECT、JOIN 和统计函数查询数据,从而大大降低了延迟。

  Impala官方宣传其计算速度是一大优点,在实际测试中我们也发现它的多表查询性能和presto差不多,但是单表查询方面却不如presto好。而且Impala有很多不支持的地方,例如:不支持update、delete操作,不支持Date数据类型,不支持ORC文件格式等等,所以我们查询时采用parquet格式进行查询,而且Impala在查询时占用的内存很大。

  5、 HAWQ

  HAWQ 是一个 Hadoop 上的 SQL 引擎,是以 Greenplum Database 为代码基础逐渐发展起来的。HAWQ 采用 MPP 架构,改进了针对 Hadoop 的基于成本的查询优化器。除了能高效处理本身的内部数据,还可通过 PXF 访问 HDFS、Hive、HBase、JSON 等外部数据源。HAWQ全面兼容 SQL 标准,能编写 SQL UDF,还可用 SQL 完成简单的数据挖掘和机器学习。无论是功能特性,还是性能表现,HAWQ 都比较适用于构建 Hadoop 分析型数据仓库应用。

  HAWQ 吸收了先进的基于成本的 SQL 查询优化器,自动生成执行计划,可优化使用hadoop 集群资源。HAWQ 采用 Dynamic pipelining 技术解决这一关键问题。Dynamic pipelining 是一种并行数据流框架,利用线性可扩展加速Hadoop查询,数据直接存储在HDFS上,并且其SQL查询优化器已经为基于HDFS的文件系统性能特征进行过细致的优化。但是我们发现HAWQ在多表查询时比Presto、Impala差一些;而且不适合单表的复杂聚合操作,单表测试性能方面要比其余四种组件差很多,hawq环境搭建也遇到了诸多问题。

  6、Kylin

  kylin 是一种 OLAP 数据引擎,支持大数据生态圈的数据分析业务,主要是通过预计算的方式将用户设定的多维度数据立方体 (cube) 缓存起来,达到快速查询的目的。应用场景应该是针对复杂 sql join 后的数据缓存。

  Kylin的核心是Cube,Cube是一种预计算技术,基本思路是预先对数据作多维索引,查询时只扫描索引而不访问原始数据从而提速。

  这种 OLAP 引擎,一般包括以下几部分:

  1.数据构建存储:cube 构建,元数据信息

  2.sql 解析执行:Query 引擎 (sql 解释器),routing 模块 (sql 执行)

  3.上层接口服务;jdbc/odbc 接口,rest 服务

  应用思路:将 hive 中的数据按照查询列 构建成 cube,存储到 hbase 中,数据轨迹连接 kylin 的 jdbc 接口实现快速查询。

  需要预计算,将数据构建成 cube 存储到 hbase;需要与现场确认是否能提供;提供 jdbc 接口和 rest 服务;将要分析的数据同步到 redis,在 redis 中快速查询数据。可以在分析前将本月数据同步到 redis。

  7、Druid

  Druid是一个快速的列式分布式的支持实时分析的数据存储系统。它在处理PB级数据、毫秒级查询、数据实时处理方面,比传统的OLAP系统有了显著的性能改进。

  Druid也是一个实时处理时序数据的OLAP数据库,因为它的索引首先按照时间分片,查询的时候也是按照时间线去路由索引。

  druid 同 kylin 一样,是采用预计算的方式。主要解决的是对于大量的基于时序的数据进行聚合查询。数据可以实时摄入,进入到 Druid 后立即可查,同时数据是几乎是不可变。通常是基于时序的事实事件,事实发生后进入 Druid,外部系统就可以对该事实进行查询。

  主要特点是:

  列式存储格式;

  大规模的并行处理;

  实时或者批量摄取;

  自愈、自平衡、易操作;

  数据进行了有效的预聚合或者预计算,查询速度快;

  可扩展的分布式系统,通常部署在数十到数百台服务器的集群中,并且提供数百万条/秒的摄取率,保留数百万条记录,以及亚秒级到几秒钟的查询延迟;

  需要预计算,将数据存储在 druid 的 Segment 文件中,占用一部分存储资源;

  需要与现场确认是否能提供。

  8、Elasticsearch

  Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对数据的见解,并管理和监控堆栈。Elasticsearch 是索引、搜索和分析魔法发生的地方。

  Elasticsearch 为所有类型的数据提供近乎实时的搜索和分析。无论您拥有结构化或非结构化文本、数字数据还是地理空间数据,Elasticsearch 都能以支持快速搜索的方式高效地存储和索引它。您可以超越简单的数据检索和聚合信息来发现数据中的趋势和模式。随着您的数据和查询量的增长,Elasticsearch 的分布式特性使您的部署能够随之无缝增长。

  ES最大的特点是使用了倒排索引解决索引问题。根据研究,ES在数据获取和聚集用的资源比在Druid高。

  9、Doris

  Doris 是一个 MPP 的 OLAP 系统,主要整合了 Google Mesa(数据模型),Apache Impala(MPP Query Engine) 和 Apache ORCFile (存储格式,编码和压缩) 的技术。

  主要作用是,对数据分析、统计,满足报表、多维分析需求。Doris 是从百度内部自主研发并贡献到 Apache 开源社区的 ROLAP 数据库。Doris 整合了 Google Mesa(数据模型),Apache Impala(MPP Query Engine) 和 Apache ORCFile (存储格式,编码和压缩) 技术,在数据查询延迟上表现非常突出。Doris 的聚合模型主要用于数据的汇总分析,明细模型主要用于明细数据的查询。相对于 Kylin 只支持汇总模型,Doris 适用的数据场景更加广泛。

  10、Clickhouse

  Clickhouse由俄罗斯yandex公司开发。专为在线数据分析而设计。Yandex是俄罗斯搜索引擎公司。官方提供的文档表名,ClickHouse 日处理记录数”十亿级”。

  特性:采用列式存储;数据压缩;基于磁盘的存储,大部分列式存储数据库为了追求速度,会将数据直接写入内存,按时内存的空间往往很小;CPU 利用率高,在计算时会使用机器上的所有 CPU 资源;支持分片,并且同一个计算任务会在不同分片上并行执行,计算完成后会将结果汇总;支持SQL,SQL 几乎成了大数据的标准工具,使用门槛较低;支持联表查询;支持实时更新;自动多副本同步;支持索引;分布式存储查询。

  ClickHouse 作为目前所有开源MPP计算框架中计算速度最快的,它在做多列的表,同时行数很多的表的查询时,性能是很让人兴奋的,但是在做多表的join时,它的性能是不如单宽表查询的。性能测试结果表明ClickHouse在单表查询方面表现出很大的性能优势,但是在多表查询中性能却比较差,不如presto和impala、hawq的效果好。

  11、 GreenPlum

  Greenplum是一个开源的大规模并行数据分析引擎。借助MPP架构,在大型数据集上执行复杂SQL分析的速度比很多解决方案都要快。

  GPDB完全支持ANSI SQL 2008标准和SQL OLAP 2003 扩展;从应用编程接口上讲,它支持ODBC和JDBC。完善的标准支持使得系统开发、维护和管理都大为方便。支持分布式事务,支持ACID。保证数据的强一致性。做为分布式数据库,拥有良好的线性扩展能力。GPDB有完善的生态系统,可以与很多企业级产品集成,譬如SAS,Cognos,Informatic,Tableau等;也可以很多种开源软件集成,譬如Pentaho,Talend 等。

  GreenPlum作为关系型数据库产品,它的特点主要就是查询速度快,数据装载速度快,批量DML处理快。而且性能可以随着硬件的添加,呈线性增加,拥有非常良好的可扩展性。因此,它主要适用于面向分析的应用。比如构建企业级ODS/EDW,或者数据集市等,GREENPLUM都是不错的选择。

  12、Flink

  Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

  Apache Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化、精密的状态管理、事件时间支持以及精确一次的状态一致性保障等。

  Flink 不仅可以运行在包括 YARN、 Mesos、Kubernetes 在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。事实证明,Flink 已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。世界各地有很多要求严苛的流处理应用都运行在 Flink 之上。

  Flink的应用场景是:实时智能推荐、复杂事件处理、实时欺诈检测、实时数仓与ETL、流数据分析、实时报表分析。

  此外,我们还对flink进行了调研发现,flink 核心是个流式的计算引擎,通过流来模拟批处理,Flink sql还处于早期开发阶段,未来社区计划通过提供基于REST的SQL客户端,目前sql客户端不能直接访问hive,通过YAML file文件定义外部数据源,可以连接文件系统和kafka。

0
相关文章