主流开源分析引擎梳理,看看你最中意谁?| StoneDB数据库观察

图片
最近一段时间,我重新梳理了一下目前市面上主流的数据分析引擎, 发现真是琳琅满目, 令人眼花缭乱。静下心来花了两周时间横向看了一下, 学习过程中, 记了一些笔记, 希望能够帮到大家。

作者 | 祁国辉

责编 | 韩 楠

封面&编辑 | 宇亭

总体来讲,分析下来, 基本脉络来自两个方向:一个是MPP数据库的大规模并行;另外一个方向来自于SQL on Hadoop。
图片
结合这两条主线, 各个产品在不同地方做了一些优化和取舍, 比如Kylin和Mesa的预计算, 比如大家ClickHouse的大宽表。

当然各家也都有一些共性,可谓是八仙过海, 各显神通。比如大家都开始尽量向标准SQL靠拢, 以屏蔽底层的技术复杂性。另外基于表组的ORC或者parquet的列式数据存储,提高OLAP查询时的IO效率,基于松耦合集群的架构,来支持海量数据下的横向扩展能力。说明在OLAP分析中的关键技术也基本上开始趋同。

而下一代的技术比如向量化执行, AI4DB、serverless、内存池化等基于最新技术的云化数仓, 也将成为下一阶段大家发力的方向。

01 Greenplum

业界最著名的开源MPP数据库,基于PostgreSQL,其架构核心是采用无共享的MPP架构,主要用于数据分析OLAP。2010年被EMC收购,于2015年开源,拥有完整的生态。
图片
图源:Docs.greenplum.orgGreenplum主要由Master节点、Segment节点、interconnect三大部分组成。

  • Greenplum master是Greenplum数据库系统的入口,接受客户端连接及提交的SQL语句,将工作负载分发给其他数据库实例(segment实例),由它们存储和处理数据。
  • Greenplum interconnect负责不同PostgreSQL实例之间的通信。
  • Greenplum segment是独立的PostgreSQL数据库,每个segment存储一部分数据。大部分查询处理都由segment完成。每个Segment存放一部分用户数据,但是用户不能直接访问Segment,所有对Segment的访问都必须经过Master。

Master节点不存放任何用户数据,只是对客户端进行访问控制以及存储表分布逻辑的元数据,Segment节点负责数据的存储,可以对分布键进行优化以充分利用Segment节点的IO性能来扩展整集群的IO性能,Segment节点越多,数据就会打得越散,处理速度就越快。

存储方式可以根据数据热度 或者访问模式的不同而使用不同的存储方式。一张表的不同数据可以使用不同的物理存储方式:行存储、列存储、外部表。

GreenPlum 属于比较早期开源的数据仓库产品, 使用的用户很多, 优缺点简要分析如下:

优点:

  1. 支持标准SQL 语法,使用简单,与上下游工具无缝集成,利用PG生态, 易于运维管理;
  2. 支持行列混存, 支持数据压缩;
  3. 性能优异,利用MPP架构, 充分发挥并行能力。

缺点:

  1. 多个PG数据库的组合, 部署在开放平台上,稳定性不足;
  2. 查询没有利用到分片键, 可能导致大量数据跨节点传输, 性能会有所下降;
  3. 因为任何一个任务都会在每个节点并行执行, 整个系统并发能力受单节点处理能力影响。

02 HAWQ

谈到GreeenPlum ,就不得不提一下HAWQ, 因为HAWQ是和GreenPlum同源的, 都是由Pivotal公司研发的, 为什么叫HAWQ, 是因为它的名字叫Hadoop with Query。它是用Hadoop替换了GreenPlum中的MPP和sharenothing的数据存储。

HAWQ是一个Hadoop原生大规模并行SQL分析引擎,目前大家使用的是Apache开源的最新的2.0 Alpha版本,数据直接存储在HDFS上,并且SQL查询优化器中已经为基于HDFS的文件系统性能特征进行过细致的优化。

SQL on Hadoop的主要设计目标是:在Hadoop上执行SQL连接时,最大程度地降低数据传输的开销。HAWQ 采用Dynamic pipelining来解决这一关键要求,使基于HDFS的数据适用于交互式查询。HAWQ要比现有Hadoop查询引擎快一或两个数量级。这些性能改进主要归功于Dynamic pipelining和HAWQ内基于成本的查询优化器的强大功能。

图片
图源:https://hawq.apache.org/docs/

Apache HAWQ 采用主从(Master-Segment)的改进MPP架构。一个典型的Apache HAWQ集群是分布式部署在多个服务器节点上,如多个物理机或多个虚拟机。在HAWQ Master端,Apache HAWQ提供集中的元数据管理并接受所有客户端连接的请求,当一个客户端的数据计算请求以SQL形式发送到Master后,被优化的分布式执行计划被生成并派发到多个Segment服务器运行,计算由多个执行器进程(QE)实现并行计算。

存储由Hadoop HDFS提供服务,绝大多数情况下Segment服务器将使用本地HDFS DataNode服务实现数据存取。集群的计算资源由Master端的资源管理器统一调度,并以资源容器的形式在Segment端体现。

HAWQ的主要优缺点总结如下:

优点:

  1. 完善的Sql支持;
  2. 原生Hadoop支持,利用YARN,能和各类Hadoop生态组件进行整合,支持各类常见的文件格式;
  3. 优异的OLAP查询性能, 利用 Pivotal Orca优化器, 性能上表现不错;
  4. 先进的架构, 对比传统MPP, 天生存算分离。

缺点:

  1. 安装配置复杂;
  2. 内部技术实现复杂, 要达到最佳性能, 还是需要内部表。

03 Hive

Hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据。由Facebook研发。

Hive 的计算基于 Hadoop 实现的一个特别的计算模型 MapReduce,它可以将计算任务分割成多个处理单元,然后分散到一批家用或服务器级别的硬件机器上,降低成本并提高水平扩展性。

Hive 的数据存储在 Hadoop 一个分布式文件系统上,即 HDFS。用户输入SQL后,Hive会将其翻译成MapReduce或者Spark任务,提交到Yarn上面执行,执行成功将返回结果。

图片
图源:https://cwiki.apache.org/confluence/display/Hive/Design

Hive比较适合离线处理,因为它把SQL转MapReduce执行响应速度较慢,Hive 发展很快,例如查询优化方面采用了 CBO,在执行引擎方面用 Tez 来替换 MapReduce,通过 LLAP 来 cache 查询结果做优化,利用DAG减少落盘次数来提速,以及 ORC 存储不断演进。

不过相比较而言,这些新技术从市场应用来说还不算成熟稳定,Hive 仍然被大量用户定义为可靠的 ETL 工具而非即时查询产品。

Hive在0.14以后的版本支持事务,前提是文件格式为 orc 格式,同时必须分桶,还必须显式声明 transactional=true。

优缺点分析:

优点:

  1. 最基础的一款Hadoop数据仓库产品,更够部署在所有Hadoop发行版本之上;
  2. 目前大多数其他技术都搭建在Hive之上,基于MR之上, 封装了SQL支持;
  3. 系统稳定, HQL使用者众多。

缺点:

  1. Hive不支持事务,一般用于读多写少的情况,不建议改动数据,因为数据存储在HDFS中,而HDFS的文件不支持修改;
  2. Hive延迟比较大,因其底层是MapReduce,执行效率较慢。但当数据规模较大的情况下,Hive的并行计算优势就体现出来了;
  3. Hive不支持索引,查询的时候是全表扫描,这也是其延迟大的原因之一。

Hive 虽然存在性能上的问题,直接使用不多,但是现在基本上作为SQL on Hadoop的基础组件, 在大数据家族中使用非常广泛。

04 Impala

Impala由Cloudera公司开发,提供SQL语义,可查询存储在Hadoop和HBase上的PB级海量数据。

Impala作为新一代开源大数据分析引擎,最初参照Dremel(由Google开发的交互式数据分析系统),支持实时计算,提供与Hive类似的功能,在性能上高出Hive3~30倍。Impala可能会超过Hive的使用率能成为Hadoop上最流行的实时计算平台。

Impala采用与商用并行关系数据库类似的分布式查询引擎,可直接从HDFS、HBase中用SQL语句查询数据,不需把SQL语句转换成MR任务,降低延迟,可很好地满足实时查询需求。

Impala不能替换Hive,可提供一个统一的平台用于实时查询。Impala的运行依赖于Hive的元数据(Metastore)。Impala和Hive采用相同的SQL语法、ODBC驱动程序和用户接口,可统一部署Hive和Impala等分析工具,同时支持批处理和实时查询。

Impala经常搭配存储引擎Kudu一起提供服务,这么做最大的优势是查询比较快,并且支持数据的Update和Delete。

Impala是采用MPP架构的查询引擎,本身不存储任何数据,直接使用内存进行计算,兼顾数据仓库,具有实时、批处理、多并发等优点。

图片
图源 https://www.w3cschool.cn/impala/impala_architecture.html

上图是Impala系统结构图,Impala和Hive、HDFS、HBase统一部署在Hadoop平台上。Impala由Impalad、State Store和Interfaces几个部分组成。

  • Implalad:是Impala的一个进程,负责协调客户端提供的查询执行,给其他Impalad分配任务,以及收集其他Impalad的执行结果进行汇总。Impalad也会执行其他Impalad给其分配的任务,主要是对本地HDFS和HBase里的部分数据进行操作。Impalad进程主要含Query Planner、Query Coordinator和Query Exec Engine三个模块,与HDFS的数据节点(HDFS DataNode)运行在同一节点上,且完全分布运行在MPP(大规模并行处理系统)架构上。
  • State Store:收集分布在集群上各个Impalad进程的资源信息,用于查询的调度,它会创建一个statestored进程,来跟踪集群中的Impalad的健康状态及位置信息。State stored进程通过创建多个线程来处理Impalad的注册订阅以及与多个Impalad保持心跳连接,此外,各Impalad都会缓存一份State Store中的信息。当State Store离线后,Impalad一旦发现State Store处于离线状态时,就会进入恢复模式,并进行返回注册。当State Store重新加入集群后,自动恢复正常,更新缓存数据。
  • Interfaces:Interfaces给用户提供了执行查询的命令行工具。Impala还提供了Hue、shell、JDBC及ODBC使用接口。

Impala的查询过程也是典型的MPP架构,当用户提交查询前,Impala先创建一个Impalad进程来负责协调客户端提交的查询,该进程会向State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息。通过CLI提交一个查询到Impalad进程,Impalad的Query Planner对SQL语句解析,生成解析树;Planner将解析树变成若干PlanFragment,发送到Query Coordinator。

图片
图源 https://www.cnblogs.com/mephisto/p/6921663.html

其中PlanFragment由PlanNode组成,能被分发到单独的节点上执行,每个PlanNode表示一个关系操作和对其执行优化需要的信息。Query Coordinator从MySQL元数据库中获取元数据(即查询需要用到哪些数据),从HDFS的名称节点中获取数据地址(即数据被保存到哪个数据节点上),从而得到存储这个查询相关数据的所有数据节点。

Query Coordinator初始化相应的Impalad上的任务,即把查询任务分配给所有存储这个查询相关数据的数据节点。Query Executor通过流式交换中间输出,并由Query Coordinator汇聚来自各个Impalad的结果。

最后Query Coordinator把汇总后的结果返回给CLI客户端。

优缺点分析:

优点:

  1. 基于内存运算,不需要把中间结果写入磁盘,省掉了大量的I/O开销;
  2. 无需转换为Mapreduce,直接访问存储在HDFS,HBase中的数据进行作业调度;
  3. 速度快。使用了支持Data locality的I/O调度机制,尽可能地将数据和计算分配在同一台机器上进行,减少了网络开销;
  4. 支持各种文件格式,如TEXTFILE 、SEQUENCEFILE 、RCFile、Parquet。可以访问Hive的metastore,对hive数据直接做数据分析。

缺点:

  1. 对内存的依赖大,且完全依赖于Hive;
  2. 实践中,分区过大会造成性能严重下降;
  3. 只能读取文本文件,不能直接读取自定义二进制文件。

05 Spark

2009年,加州大学伯克利分校的AMP实验室,诞生了一个叫做Spark的项目。该项目在2013年成为了Apache的孵化项目,并以极快的速度成为了一个备受欢迎和关注的顶级项目。

Spark项目的初衷是为了代替MapReduce,提供一种既可以极大批量地处理分布式的数据,又有足够的容错能力,且上手容易,速度快,可以让人实现实时交互分析的解决方案。既支持作业任务处理,又支持流处理(SparkStreaming)和SQL(SparkSQL),以及机器学习和图处理,社区生态活跃。

Hive是提供了一个SQL on hadoop的机制, 使得基于Hadoop的查询变得容易很多, 但是因为Hive底层仍然是使用Map/Reduce的方法, 所以在过程中需要把大量的中间结果保存在磁盘中,因而整体的性能偏慢。

而 Spark 没有像 Hive 一样使用磁盘读写,而转用性能高得多的内存存储输入数据、处理中间结果,以及存储最终结果。在大数据的场景中,很多计算都有循环往复的特点,像 Spark 这样允许在内存中缓存输入输出,上一个 job 的结果马上可以被下一个使用,性能自然要比 Hive 好得多。

Spark的技术核心点在于 弹性分布式数据集(RDD,Resilient Distributed Datasets)。RDD是一种分布式的内存抽象,允许在大型集群上执行基于内存的计算(In-Memory Computing),Spark RDD能够将数据cache到内存中,省去了从磁盘加载的过程,同时Spark shuffle过程中的数据也是直接放在内存中的。

RDD是一个分区的只读记录的集合,用户可以控制RDD的其他两个方面:持久化和分区。

一方面用户可以选择重用哪个RDD,并为其制定存储策略(比如,内存存储), Spark提供了三种对持久化RDD的存储策略:未序列化Java对象存于内存中、序列化后的数据存于内存、序列化后的数据存于磁盘存储。

另一方面可以让RDD中的数据 根据记录的key 分布到集群的多个机器上, 实现分布式内存计算。

后来Spark 继续扩展,数据存储模式也有了不同的选择, 数据可以存储成为parquet, 也可存储在数据库, 当然也可以存储在Hive表上。

通常认为,与MR相比spark通过内存计算来显著提速。Spark社区非常成熟,后面提到的很多平台或大数据组件,都与Spark实现无缝集成。

优缺点分析:
优点:

  1. 速度更快:因为使用内存引擎, 数据不落地,Spark性能表现非常优异;
  2. 易用性:提供丰富的API,支持JAVA、Scala、Python和R四种语言;
  3. 通用性:Spark提供了大量的库,包括SQL、DataFrames、MLlib、GraphX和Spark Streaming。开发人员可以在同一个应用程序中无缝地组合这些库。

缺点:

  1. 稳定性, 因为大量数据在内存中计算, 完全依赖java的内存回收机制, 长时间运行容易出现故障;
  2. 无法支持海量数据, 因为要在内存中生成RDD, 所以数据量受内存限制;
  3. 不能像SQL一样, 支持复杂统计分析。

06 Kylin

Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。核心是预加载和构建cube,cube指定度量维度,Kylin的核心思想是预计算,利用空间换时间来加速查询模式固定的OLAP查询。

Kylin 的理论基础是 Cube 理论,每一种维度组合称之为 Cuboid,所有 Cuboid 的集合是 Cube。其中由所有维度组成的 Cuboid 称为 Base Cuboid,图中(time,item,location,supplier)即为 Base Cuboid,所有的 Cuboid 都可以基于 Base Cuboid 计算出来。Cuboid 我们可以理解为就是一张预计算过后的大宽表,在查询时,Kylin 会自动选择满足条件的最合适的 Cuboid来进行加速。

图片
图源:Apache Kylin | Apache kylin4 新架构分享

下图所示内容则描述了Kylin和周边生态产品共存的关系, 以及Kylin内部数据获取, 构建Cube, 用户查询交互和SQL 解析优化的全流程。
图片
图源:Apache Kylin | 大数据分析型数据仓库

在目前开源版本的实现中,构建完的数据是存储在 HBase 中的,而Hbase的缺点造成很多的局限:

  • 运维困难,一旦 HBase 性能不好,那么Kylin的性能也会受到影响。
  • HBase 的资源隔离能力也比较弱,Kylin 的性能会受到Hbase上其他大负载的影响。
  • HBase 里存储的都是经过编码后的 Byte Array 类型,性能优化比较困难。

Kylin 4.0中引入了新的架构, 支持Spark+ parquet, 通过Spark的并行能力提升性能,不过只在商业版本中使用, 此处就不再赘述了。

优缺点分析:
优点:

  • 支持标准SQL接口;
  • 支持超大数据集;
  • 超高性能,通过预计算达到亚秒级响应。

缺点:

  • 集群依赖较多,如HBase和Hive等,属于重量级方案,因此运维成本也较高;
  • 维度变化需要重新刷新数据,不适合即席查询分析;
  • 维度多容易出现数据爆炸。

07 Apache Kudu

Kudu是Cloudera开源的运行在hadoop平台上的列式存储系统(fast analytics on fast data),核心C++编写。

它比HDFS和Hbase的优势在于以下亮点:

一是kudu的表结构与关系型数据库类似,使用简单;

二是提供高效插入/更新机制,大量随机读性能要显著超过Hbase。

因此可以适用于近实时的分析,快速分析那些快速变化的数据。
image.png
图源:Apache Kudu - Introducing Apache Kudu

  • kudu由master server与tablet server两部分组成:
  • master server负责集群管理、元数据管理等管理工作;
  • tablet server提供数据存储、数据读写功能。

上图显示了一个具有三个 master 和多个tablet server的Kudu集群,每个服务器都支持多个tablet。它说明了如何使用 Raft 共识来允许master和tablet server的leader和follow。

此外,tablet server 可以成为某些 tablet 的 leader,也可以是其他 tablet follower。leader以金色显示,而 follower 则显示为蓝色。

和HBase采用的LSM方案不同的是,Kudu对同一行的数据更新记录的合并工作是在更新的时候进行,在Kudu中一行数据只会存在于一个DiskRowSet中,避免读操作时的比较合并工作。在Kudu中,对于Flush到磁盘上的DiskRowSet(DRS)数据,实际上是分两种形式存在的:

  • 一种是Base的数据,按列式存储格式存在,一旦生成,就不再修改;
  • 另一种是Delta文件,存储Base数据中有变更的数据,一个Base文件可以对应多个Delta文件,更新、删除操作需要记录到特殊的数据结构里,保存在内存中的DeltaMemStore或磁盘上的DeltaFIle里面。DeltaMemStore是B-Tree实现的,因此速度快,而且可修改。磁盘上的DeltaFIle是二进制的列式的块,当数据频繁删改的时候,磁盘上会有大量的DeltaFiles文件,Kudu会定期对这些文件进行合并。

优缺点分析:

优点:

  1. 使用简单,kudu的表结构与关系型数据库类似;
  2. 支持高效插入/更新机制,大量随机读性能要显著超过Hbase。

缺点:

  1. 并发支持能力不足;
  2. 一般和Impala结合使用,架构复杂;
  3. 国内用户不多。

08 ClickHouse

ClickHouse 是由俄罗斯的第一大搜索引擎 Yandex 公司开源的列存数据库。

ClickHouse 作为开源 OLAP 引擎,因其出色的性能表现在大数据生态中得到了广泛的应用。它使用本地盘来自己管理数据,官方推荐使用 SSD 作为存储介质来提升性能。

相比传统的大数据解决方案,ClickHouse 有以下的优点:

  • 配置丰富,只依赖于 Zookeeper线性可扩展性;
  • 可以通过添加服务器扩展集群容错性高;
  • 不同分片间采用异步多主复制单表性能极佳;
  • 采用向量计算;
  • 支持采样和近似计算等优化手段功能强大;
  • 支持多种表引擎。

image.png
图源:https://help.aliyun.com/document_detail/167448.html?spm=a2c4g...

优缺点分析:

优点:

  1. 速度快。ClickHouse性能超过了市面上大部分的列式存储数据库,相比传统的数据ClickHouse要快100~1000倍,ClickHouse还是有非常大的优势。
  2. 功能多。ClickHouse支持数据统计分析各种场景,支持类SQL查询,支持多库函数(例如 IP转化,URL分析等,预估计算/HyperLoglog等)支持数组(Array)和嵌套数据结构(Nested Data Structure),支持数据库异地复制部署。
  3. 独立技术架构,部署简单,可以在目前任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。

缺点:

  1. 模型简单,因为 Clickhouse 对 join 支持不好,所以一般都是把数据拼成一个大宽表来执行, 那么一旦需求变换, 或者数据分析维度变化, 表中的数据必须重新刷新, 带来巨大的工作量, 同时这种大宽表带来巨大的数据膨胀。
  2. 并发支持不足, Clickhouse 并发支持能力弱, 在OLAP场景中,一旦出现多个用户并发查询, 查询性能会受到巨大影响。甚至导致无法返回结果。
  3. ClickHouse 不支持事务性的 DDL 与 DML 操作,而且多副本模式的元数据管理强依赖于 ZooKeeper,表结构变更时常常出现不同副本之间元数据不一致的问题。
  4. 多种表引擎带来选择困难症, Clickhouse 提供28种表引擎, 不同表引擎适合不同场景, 不利于新手上手学习。

09 Druid

Apache Druid,由美国MetaMarkets公司开发,后来Apache 基金会孵化而出。它具有如下特性:

  • 实时可见:消息摄入后分钟级查询可见;
  • 交互查询:查询延时在秒级,核心思想为内存计算和并行计算;
  • 维度灵活:支持几十个维度任意组合,仅在索引时指定的维度查询可见;
  • 易于变更:需求变更后调整索引配置立马生效;
  • 流批一体:新版本 KIS 模式可实现 Exactly Once 语义。
    图片
    图源:Design · Apache Druid
  • Druid有几种不同的Services:
  • Coordinator 负责在集群环境中的数据可用性;
  • Overlord 控制数据装载workload的分派;
  • Broker 负责承接用户请求;
  • Router 可选,负责请求的路由, 把响应请求分别路由到Broker, Coordinators, 和Overlords;
  • Historical 负责存储查询数据;
  • MiddleManager 负责数据装载。

Druid 服务可以按照用户需求随意部署,但是为了便于部署, 一般建议按照上图来部署, 分成几种服务器类型: Master, Query, Data。

  • Master:运行 Coordinator 和 Overlord 服务, 负责数据的持久化保存和数据的装载的分派;
  • Query:运行 Broker 和可选的路由服务, 负责处理来自客户端的查询;
  • Data:运行Historical 和 MiddleManager 服务,执行数据装载任务和存储所有数据。

Druid还包含3个外部依赖:

  • Metadata:存储Druid中的各种metadata(里面的数据都是Druid自身创建和插入的),包含3张表:”druid_config”(通常是空的), “druid_rules”(coordinator nodes使用的一些规则信息,比如哪个segment从哪个node去load)和“druid_segments”(存储每个segment的metadata信息)。
  • Deep storage:存储segments,Druid目前已经支持本地磁盘,NFS挂载磁盘,HDFS,S3等。Deep Storage的数据有2个来源,一个是Batch,另一个是real-time nodes。
  • ZooKeeper:被Druid用于管理当前cluster的状态,比如记录哪些segments从Real-time nodes移到了Historical nodes。

优缺点分析:
优点:

  1. 高性能,低延迟。Druid 能够对历史和实时数据提供亚秒级别的查询,Druid 支持低延时的数据摄取,灵活的数据探索分析,高性能的数据聚合。
  2. 简便的水平扩展。适用于数据量大,可扩展能力要求高的分析型查询系统。
  3. 支持实时数据摄入。其机制将热点和实时数据存储在实时节点(Realtime Node)内存中,将历史数据存储在历史节点(history node)的硬盘中,实时+伪实时的结构,保证查询基本都在毫秒级。

缺点:

  1. 配置和查询都比较复杂和繁琐,维度变更复杂。
  2. 不支持SQL或类SQL接口。对SQL支持的不够完善, 不支持Join。
  3. 支持时序实时摄入, 对update支持不足。

10 Presto(Trino)

Presto是由FaceBook开源的一个基于内存的MPP计算引擎,主要用以解决 Facebook 海量 Hadoop 数据仓库的低延迟交互分析问题。

Facebook版本的Presto更多的是以解决企业内部需求功能为主,也叫Presto DB,后来,Presto其中的几个人出来创建了更通用的Presto分支,取名Presto SQL,这个开源版本也是更为被大家通用的版本。再后来,为了更好地与Facebook的Presto DB进行区分,Presto SQL改名为Trino。

Presto 适用于交互式分析查询,可支持众多的数据源,包括 HDFS、RDBMS、KAFKA 等,而且提供了非常友好的接口开发数据源连接器。数据规模可以支持GB到PB级,主要应用于处理秒级查询的场景。

image.png
图源:Presto_SQL_on_Everything.pdf (trino.io)

组件工作模式:

  • Coordinator :是一个中心的查询角色,它主要的一个作用是接受查询请求,将他们转换成各种各样的任务,将任务拆解后分发到多个worker去执行各种任务的节点 :
  1. 解析SQL语句;
  2. 生成执行计划 ;
  3. 分发执⾏任务给Worker节点执行。
  • Worker :是一个真正的计算的节点,执行任务的节点,它接收到task后,就会到对应的数据源里面,去把数据提取出来;
  • Connector:负责实际执⾏查询任务, 通过不同的connector去适配不同的数据源;
  • Discover Services:是将coordinator和woker结合到一起的服务,上图中的Metadata和 Data Location:
  1. Worker节点启动后向Discovery Server服务注册;
  2. Coordinator从Discovery Server获得Worker节点。

Presto是通过connector plugin获取数据和元信息的,它不是一个数据存储引擎,不需要有数据,presto为其他数据存储系统提供了SQL能⼒,客户端协议是HTTP+JSON。

优缺点分析:
优点:

  1. Presto/Trino支持内存并行处理、跨集群节点管线执行、多线程执行模型、高效的扁平内存数据结构(最小化Java的垃圾回收)、Java字节码生成。超过了Impala和Spark SQL。
  2. 支持多源联邦查询,我们的数据会储存在各种各样的数据库中,以前都需要经过ETL抽取到数据仓库中,现在用Presto/Trino在一条SQL中就能直接查询多个不同数据源实现联邦查询,而且SQL语法兼容大部分HiveQL。
  3. 支持湖仓一体,减少数据仓库复杂度:可以去除数仓的ODS、DWD层,甚至可以不用DWM层,用Presto/Trino连接各种数据源,直接清洗出DWS大宽表层。而且维度表也可以使用Presto/Trino直接从源数据库读取,并使用Presto/Trino向ADS数据应用层提供服务。

缺点:

  1. join查询时,都要使用临时表。此时就会产生大量的临时数据,所以速度会变慢。
  2. 不适合计算太大的数据量。
  3. 不关心中间查询容错,如果某个节点失败,整个查询也将失败。

11 Google Mesa

Mesa是一个分布式、多副本的、高可用的数据处理、存储和查询系统,针对结构化数据。一般数据从上游服务产生(比如一个批次的spark streaming作业产生),在内部做数据的聚合和存储。支持近实时更新(与Cube方案比),数据分维度列和指标列,指标列指定聚合函数。

Mesa能满足复杂和具有挑战性的用户与系统需求,包括近实时数据提取和查询,同时在海量数据和查询量中保持高可用性、可靠性、容错率和扩展性。Mesa每秒能处理数百万行更新,每天进行数十亿查询抓取数万亿行数据。Mesa能进行跨数据中心复制,即使在整个数据中心故障时,也能以低延迟返回一致和可重复的查询结果。

它的特色类似MOLAP, 对各种关键维度(Key)进行预先聚合, 用户查询直接访问聚合后的数据, 对于数据的持续更新,会在后台以Micro-batch的方式进行更新, 所有的更新会保存在Delta中, 后台会根据一定条件对预聚合的数据核Delta 进行compaction。主要用于Google AD部门。

优缺点分析:
优点:

  1. 近实时的更新吞吐量。支持持续的更新,每秒支持数百万行的更新。
  2. 同时支持低时延查询性能和批量大量查询。99%的查询在几百毫秒之内返回。
  3. 跨数据中心备份。

缺点:

  1. 仅在Google内部使用, 专为Google 广告业务服务。
  2. 市面上相关材料不多, 用户也不多。
  3. Google Mesa的数据模型,后来也被百度的广告部门所采用, 也就产生了下面要提到的这一产品,Apache Doris。

12 Apache Doris

前身是百度2017年开源系统PALO,后贡献给Apache更名为Doris。Doris 是一个 MPP 的 OLAP 系统,主要整合了 Google Mesa(数据模型),Apache Impala(MPP Query Engine)和 Apache ORCFile (存储格式,编码和压缩) 的技术。高度兼容Mysql协议。

元数据管理对impala的p2p模式做了更新,Doris 采用 Paxos 协议以及 Memory + Checkpoint + Journal 的机制来确保元数据的高性能及高可靠。

2020 年 2 月,百度 Doris 团队的开发人员离职创业,基于 Apache Doris 之前的版本做了自己的商业化产品 DorisDB ,后改名为StarRocks。后来StarRocks 也开源了, 所以在此认为这两个产品同源。

图片
图源:Introduction to Apache Doris - Apache Doris

部署架构:分为 FE(前端)和 BE(后端)两个组件。

图片
图源:Introduction to Apache Doris - Apache Doris

  • FE 负责接受用户请求、优化、调度查询,由 Java 编写;对于所有的元数据, 保存在内置的BerkeleyDB, 并且通过多副本实现高可用。
  • BE 负责存储数据、执行 MPP 计划中的各个片段,类似于 Worker 的角色,由 C++ 编写。

优缺点分析:

优点:

  1. 良好的架构设计,支持高并发低延时的查询服务,支持高吞吐量的交互式分析。多FE均可对外提供服务,并发增加时,线性扩充FE和BE即可支持高并发的查询请求。
  2. 性能优异:高效的列式存储引擎,同时 提供丰富的索引结构来加速数据读取与过滤,利用分区分桶裁剪功能支持在线服务业务的超高并发,单节点最高可支持上千 QPS。更进一步,结合向量化执行引擎来提升效率,同时利用物化视图技术实现预聚合加速,同时进行基于规划和基于代价的查询优化。
  3. 支持批量数据load和流式数据load,支持数据更新。支持Update/Delete语法,unique/aggregate数据模型,支持动态更新数据,实时更新聚合指标。
  4. 提供了高可用,容错处理,高扩展的企业级特性。FE Leader错误异常,FE Follower秒级切换为新Leader继续对外提供服务。支持数据多副本存储,集群具备自愈功能,自身的分布式管理框架可以自动管理数据副本的分布、修复和均衡,副本损坏时系统可以自动感知并进行修复。
  5. 支持聚合表和物化视图。多种数据模型,支持aggregate, replace等多种数据模型,支持创建rollup表,支持创建物化视图。rollup表和物化视图支持动态更新,无需用户手动处理。
  6. MySQL协议兼容,支持直接使用MySQL客户端连接,非常易用的数据应用对接。

缺点:

  1. 目前 Doris 比较抢眼,尤其是推出全量化支持之后,但是本身成熟度还有待考验。
  2. 目前国内有多个基于 Doris 的产品, 各自独立演进,可能会对后期有影响。

13 总结

开源分析引擎发展十多年来, 不断有新的思想加入, 也不断有新的技术和产品被世人所接受,每个产品之所以能够得到大家的认可, 必然具有其独到的一些特点。当然,开源产品的共同特色就是优点和缺点都非常明显;在学习开源引擎的过程中, 建议大家多去做一些横向对比,通过对比,就可以理解每个产品的优势和短板, 进一步对产品原理有更深入的体会。

下面通过一个简单的表格来示例:
image.png
补充一点:部分资料和架构图均来自网上, 如有侵权,将做删除处理。

参考资料:

[1]https://docs.vmware.com/en/VMware-Tanzu-Greenplum/6/greenplum...

[2]https://hawq.apache.org/docs/userguide/2.3.0.0-incubating/ove...

[3]https://cwiki.apache.org/confluence/display/Hive/Design

[4]https://www.w3cschool.cn/impala/impala_architecture.html

[5]Apache Kylin | 大数据分析型数据仓库

[6]Apache Kylin | Apache kylin4 新架构分享

[7]Apache Kudu - Introducing Apache Kudu

[8]https://help.aliyun.com/document_detail/167448.html?spm=a2c4g...

[9]Design · Apache Druid

[10]Presto_SQL_on_Everything.pdf (trino.io)

[11]Introduction to Apache Doris - Apache Doris

作者介绍

图片
祁国辉:前 Oracle 云平台事业部电信行业技术总监现任杭州石原子科技有限公司合伙人
【作者介绍】网名"atiger",前 Oracle 云平台事业部电信行业技术总监。拥有超过25年数据库和数据仓库HK经验。曾创办著名数据仓库网站:www.dwway.com (数据仓库之路)。如果您对我们的源码感兴趣,欢迎到我们的 GitHub 代码仓库阅读查看,觉得不错记得点个 Star 哦~StoneDB

代码仓库:https://github.com/stoneatom/stonedbStoneDB
社区官网:https://stonedb.io/

你可能感兴趣的:(数据库mysql)