当前位置: 首页 > news >正文

主流开源OLAP对比分析

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

目前主流的开源OLAP产品按照此分类主要有以下产品:
在这里插入图片描述

以下针对以上几种开源组件分别进行概要的介绍说明,并进行相关特性的对比。

MOLAP

Kylin

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

  1. 亚秒级查询响应;
  2. 支持百亿、千亿甚至万亿级别交互式分析;

缺点:

  1. 不支持 insert, update, delete 等 SQL 操作,用户修改数据的话需要重新批量导入(构建);
  2. 需要预先建立模型后加载数据到 Cube 后才可进行查询

Druid

Apache Druid是高性能的实时分析数据库,主要提供对大量的基于时序的数据进行OLAP查询能力。支持毫秒级的快速的交互式查询。Druid的核心设计结合了数据仓库、时间序列数据库和搜索系统的思想,适用于多种场景的高性能数据实时分析。
Druid的架构图如下:
在这里插入图片描述优点:

  1. 为分析而设计:为OLAP工作流的探索性分析而构建。它支持各种filter、aggregator和查询类型。
  2. 交互式查询:低延迟数据摄取架构允许事件在它们创建后毫秒内查询。
  3. 高可用:数据在系统更新时依然可用、可查询。规模的扩大和缩小不会造成数据丢失。
  4. 可伸缩:每天处理数十亿事件和TB级数据。

缺点:

  1. 不支持更新操作,数据不可更改
  2. 不支持事实表之间的关联

对比Kylin:

  • 都是cube预计算
  • 支持流式更灵活
  • Kylin 利用 Hadoop/HBase 做计算和存储,使用 SQL 查询,提供 JDBC/ODBC 驱动与常见 BI 工具集成
  • Druid 有自己独立的分布式集群,能够实时摄入数据,有自己的查询接口(与BI兼容性较弱),通常多用于实时要求高的场景

ROLAP

Greeplum

GreenPlum是基于PostgreSQL的开源MPP数据库,具有良好的线性扩展能力,具有高效的并行运算和并行存储特性。
GreenPlum的架构图如下:
在这里插入图片描述
优点:

  1. 支持多态数据存储(行存、列存),允许用户根据应用定义数据分布方式,可提高查询性能。
  2. 具有高效的SQL优化器,针对OLAP查询进行优化。
  3. SQL支持完善,支持insert、delete、update,支持事务的ACID。

缺点:

  1. 存在“木桶效应”,单机故障会导致性能严重下降,因此集群规模不能太大。
  2. 并发性能不高。

ClickHouse

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

  1. 着眼硬件。基于将硬件功效最大化的目的,ClickHouse会在内存中进行GROUP BY;与此同时,他们非常在意CPU L3级别的缓存,因为一次L3的缓存失效会带来70~100ns的延迟,意味着在单核CPU上,它会浪费4000万次/秒的运算。正因为注意了这些细节,所以ClickHouse在基准查询中能做到1.75亿次/秒的数据扫描性能。
  2. 注重算法。例如,在字符串搜索方面,针对不同的场景,ClickHouse选择了多种算法:对于常量,使用Volnitsky算法;对于非常量,使用CPU的向量化执行SIMD,暴力优化;正则匹配使用re2和hyperscan算法。除了字符串之外,其余的场景也与它类似,ClickHouse会使用最合适、最快的算法。如果世面上出现了号称性能强大的新算法,ClickHouse团队会立即将其纳入并进行验证。
  3. 特定场景,特殊优化。针对同一个场景的不同状况,选择使用不同的实现方式,尽可能将性能最大化。对于数据结构比较清晰的场景,会通过代码生成技术实现循环展开,以减少循环次数。
  4. 向量化执行。SIMD被广泛地应用于文本转换、数据过滤、数据解压和JSON转换等场景。相较于单纯地使用CPU,利用寄存器暴力优化也算是一种降维打击了。

ClickHouse的架构图如下:
在这里插入图片描述

优点:

  1. 单表查询速度极快

缺点:

  1. 不支持事务,不支持真正的删除/更新;
  2. 不支持高并发,Clickhouse快是因为采用了并行处理机制,即使一个查询,也会用服务器一半的CPU去执行;
  3. join性能不高

Impala

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

优点:

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

缺点:

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

Hawq

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

  1. 对SQL标准的完善支持:ANSI SQL标准,OLAP扩展,标准JDBC/ODBC支持。
  2. 支持ACID事务特性:这是很多现有基于Hadoop的SQL引擎做不到的,对保证数据一致性很重要。
  3. 动态数据流引擎:基于UDP的高速互联网络。
  4. 多种UDF(用户自定义函数)语言支持:java, python, c/c++, perl, R等。

缺点:

  1. 基于GreenPlum实现,技术实现复杂,包含多个组件。比如对于外部数据源,需要通过PXF单独进行处理;
  2. C++实现,对内存的控制比较复杂,如果出现segmentfault直接导致当前node挂掉;

Presto

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

  1. 基于内存运算,减少没必要的硬盘IO,所以快。
  2. 能够处理PB级别的海量数据分析。(虽然能够处理PB级别的海量数据分析,但不是代表Presto把PB级别都放在内存中计算的。而是根据场景,如count,avg等聚合运算,是边读数据边计算,再清内存,再读数据再计算,这种耗的内存并不高。)
  3. 能够连接多个数据源,跨数据源关联查询。
  4. 清晰的架构,是一个能够独立运行的系统,不依赖于任何其他外部系统,部署简单。

缺点:

  1. 不适合多个大表的join操作,因为presto是基于内存的,太多数据内存放不下的。
  2. Presto的一个权衡是不关心中间查询容错。如果其中一个Presto工作节点出现故障(例如,关闭),则大多数情况下正在进行的查询将中止并需要重新启动。

对比Hive:

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

对比Spark:

  1. 目标:Presto强调查询,但Spark重点强调计算。
  2. 架构:Presto的体系结构与MPP SQL引擎非常相似。这意味着仅针对SQL查询执行进行了高度优化,而Spark是一个通用执行框架,能够运行多个不同的工作负载,如ETL,机器学习等。
  3. 任务启动:Presto的查询没有太多开销,Presto协调器始终处于启动状态并等待查询。而Spark驱动程序启动需要时间与集群管理器协商资源,复制jar,才开始处理。
  4. 任务提交:Spark提交任务并在每个阶段实时应用资源(与presto相比,这种策略可能导致处理速度稍慢); Presto一次申请所需资源,并且一次提交所有任务。
  5. 数据处理:在spark中,数据需要在进入下一阶段之前完全处理。 Presto是流水线式处理模式。只要一个page完成处理,就可以将其发送到下一个task(这种方法大大减少了各种查询的端到端响应时间)。
  6. 内存:两者都是内存存储和计算,当它无法获得足够的内存时,spark会将数据写入磁盘,但presto会导致OOM。
  7. 容错:如果Spark任务失败或数据丢失,它将重新计算。但是presto会导致查询失败。

Drill

Drill是MapR开源的一个低延迟的大数据集的分布式SQL查询引擎,是谷歌Dremel的开源实现。它支持对本地文件、HDFS、HBASE等数据进行数据查询,也支持对如JSON等schema-free的数据进行查询。
Drill的架构图如下:
在这里插入图片描述
从架构上看,与同是源自Dremel的Impala比较类似。
优点:

  1. 能够自动解析数据(json,text,parquet)的结构。
  2. 支持自定义的嵌套数据集,数据灵活,支持查询复杂的半结构化数据。
  3. 与Hive一体化(Hive表和视图的查询,支持所有的Hive文件格式和HiveUDFS)。
  4. 支持多数据源,包括NoSQL数据库。

缺点:

  1. SQL语法和常规SQL有区别,一般是如“select * from 插件名.表名”的形式。
  2. 安装部署比较复杂。
  3. GC机制还有待提高。

SparkSQL

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

  1. 将sql查询与spark无缝融合
  2. 兼容HiveQL

缺点:

  1. 查询性能不高
  2. 以thrift server方式提供的SparkSQL服务不支持多种数据源,必须使用DataFrame API。

Hive

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

  1. 高可靠、高容错:HiveServer采用集群模式。双MetaStor。超时重试机制。
  2. 类SQL:类似SQL语法,内置大量函数。
  3. 可扩展:自定义存储格式,自定义函数。
  4. 多接口:Beeline,JDBC,ODBC,Python,Thrift。

缺点:

  1. 延迟较高:默认MR为执行引擎,MR延迟较高。
  2. 不支持物化视图:Hive支持普通视图,不支持物化视图。Hive不能再视图上更新、插入、删除数据。
  3. 不适用OLTP:暂不支持列级别的数据添加、更新、删除操作。

性能对比

针对这几款开源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在单大表聚合操作方面的表现也相对优秀。

综合对比分析

针对上述各开源产品的描述及性能对比,我们使用下面表格来对这些产品进行一个较全面的对比,

DruidKylinGreenplumClickHouseImpalaHawqPrestoDrillHiveSparkSQL
分类MOLAPMOLAPROLAPROLAPROLAPROLAPROLAPROLAPROLAPROLAP
架构预计算预计算MPP数据库MPP数据库SQL引擎SQL引擎SQL引擎SQL引擎SQL引擎SQL引擎
依赖Hadoop
事务支持
SQL功能支持有限有限完善有限有限完善有限有限有限有限
支持更新不支持不支持支持不支持不支持支持不支持不支持不支持不支持
优点超大数据集支持超大数据集支持完善的数据库产品,适合用于企业级数仓单表查询性能极佳多表关联性能不错Hadoop之上的事务支持整体性能不错,支持多数据源支持多数据源可靠性较高融合SQL与Spark
缺点灵活性差灵活性差单机故障导致木桶效应多表关联性能不佳查询内存占用大不适合单表复杂聚合操作容错性不强,纯内存操作,内存放不下会报错GC问题延迟较高多表单表性能都不突出

相关文章:

  • 二叉搜索树的基本操作 || TreeMap和TreeSet介绍
  • 超详细的数据结构---顺序表的有关教程
  • Exchange Server 2016 安装部署
  • 【C51单片机】中断系统之单一外中断应用
  • 2.2 Linux系统的目录结构与文件类型
  • jedis:使用事务开启watch监控
  • 【趣学算法】第一章 算法之美(上)
  • 以MapBox为核心构建Vue地图组件库教程
  • Web链接测试如何做?
  • 【不是问题的问题】为什么复位中断服务程序里面直接调用的main函数,难道所有程序都在复位中断里面执行的?
  • 【ViT 微调时关于position embedding如何插值(interpolate)的详解】
  • 动态内存管理(malloc free calloc realloc)
  • C语言/C++内存管理
  • 【FPGA】什么是串行通信?
  • c语言必背100代码,C语言代码大全(c语言必背项目代码)
  • [PHP内核探索]PHP中的哈希表
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 4. 路由到控制器 - Laravel从零开始教程
  • Brief introduction of how to 'Call, Apply and Bind'
  • canvas 高仿 Apple Watch 表盘
  • cookie和session
  • CSS居中完全指南——构建CSS居中决策树
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Logstash 参考指南(目录)
  • Node项目之评分系统(二)- 数据库设计
  • spring boot下thymeleaf全局静态变量配置
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分布式任务队列Celery
  • 关于 Cirru Editor 存储格式
  • 基于Android乐音识别(2)
  • 基于web的全景—— Pannellum小试
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 区块链技术特点之去中心化特性
  • 深度解析利用ES6进行Promise封装总结
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 微信小程序开发问题汇总
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 小程序开发之路(一)
  • 译有关态射的一切
  • 怎样选择前端框架
  • 2017年360最后一道编程题
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​520就是要宠粉,你的心头书我买单
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #define、const、typedef的差别
  • #Linux(帮助手册)
  • #单片机(TB6600驱动42步进电机)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (NSDate) 时间 (time )比较
  • (Python) SOAP Web Service (HTTP POST)
  • (待修改)PyG安装步骤
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (三)uboot源码分析