2021-常用引擎对比与概述

OLAP常用引擎对比与概述

我们来介绍和对比一下目前大数据业内非常流行的几个OLAP引擎,它们是Hive、SparkSQL、FlinkSQL、ClickHouse、Elasticsearch、Druid、Kylin、Presto、Impala、Doris。可以说目前没有一个引擎能在数据量,灵活程度和性能上做到完美,用户需要根据自己的需求进行选型。

能力对比

并发能力与查询延迟对比

这里可能有朋友有疑问:Hive,SparkSQL,FlinkSQL这些它们要么查询速度慢,要么QPS上不去,怎么能算是OLAP引擎呢?其实OLAP的定义中并没有关于查询执行速度和QPS的限定。进一步来说,这里引出了衡量OLAP特定业务场景的两个重要的指标:

  • 查询速度:Search Latency(常用Search Latency Pct99来衡量)
  • 查询并发能力:QPS

如果根据不同的查询场景、再按照查询速度与查询并发能力这两个指标来划分以上所列的OLAP引擎,这些OLAP引擎的能力划分如下。

简单查询

简单查询指的是点查、简单聚合查询或者数据查询能够命中索引或物化视图(物化视图指的是物化的查询中间结果,如预聚合数据。这样的查询经常出现在【在线数据服务】的企业应用中,如阿里生意参谋、腾讯的广点通、京东的广告业务等,它们共同的特点是对外服务、面向B端商业客户(通常是几十万的级别;并发查询量(QPS)大;对响应时间要求高,一般是ms级别(可以想象一下,如果广告主查询页面投放数据,如果10s还没有结果,很伤害体验;查询模式相对固定且简单。从下图可知,这种场景最合适的是Elasticsearch、Doris、Druid、Kylin这些。

简单查询

复杂查询

复杂查询指的是复杂聚合查询、大批量数据SCAN、复杂的查询(如JOIN。在ad-hoc场景中,经常会有这样的查询,往往用户不能预先知道要查询什么,更多的是探索式的。这里也根据QPS和查询耗时分几种情况,如下图所示,根据业务的需求来选择对应的引擎即可。有一点要提的是FlinkSQLSparkSQL虽然也能完成类似需求,但是它们目前还不是开箱即用,需要做周边生态建设,这两种技术目前更多的应用场景还是在通过操作灵活的编程API来完成流式或离线的计算上。

复杂查询

执行模型对比

执行模型对比

  • Scatter-Gather执行模型:相当于MapReduce中的一趟MapReduce,没有多轮的迭代,而且中间计算结果往往存储在内存中,通过网络直接交换。Elasticsearch、Druid、Kylin都是此模型。
  • MapReduce:Hive是此模型
  • MPP:MPP学名是大规模并行计算,其实很难给它一个准确的定义。如果说的宽泛一点,Presto、Impala、Doris、ClickHouse、Spark SQL、Flink SQL这些都算。有人说Spark SQLFlink SQL属于DAG模型,我们思考后认为,DAG并不算一种单独的模型,它只是生成执行计划的一种方式。

OLAP引擎的主要特点

Hive

Hive

Hive是一个分布式SQL on Hadoop方案,底层依赖MapReduce计算模型执行分布式计算。Hive擅长执行长时间运行的离线批处理,数据量越大,优势越明显。Hive在数据量大、数据驱动需求强烈的互联网大厂比较流行。近2年,随着ClickHouse的逐渐流行,对于一些总数据量不超过百PB级别的互联网数据仓库需求,已经有多家公司改为了ClickHouse的方案。ClickHouse的优势是单个查询执行速度更快,不依赖hadoop,架构和运维更简单。

Spark SQL 与 Flink SQL

在大部分场景下,Hive计算还是太慢了,别说不能满足那些要求高QPS、低查询延迟的的对外在线服务的需求,就连企业内部的产品、运营、数据分析师也会经常抱怨Hive执行ad-hoc查询太慢。这些痛点,推动了MPP内存迭代和DAG计算模型的诞生和发展,诸如Spark SQL、Flink SQL、Presto这些技术,目前在企业中也非常流行。Spark SQL、Flink SQL的执行速度更快,编程API丰富,同时支持流式计算与批处理,并且有流批统一的趋势,使大数据应用更简单。

注:上面说的在线服务,指的是如阿里对几百万淘宝店主开放的数据应用生意参谋,腾讯对几十万广告主开发的广点通广告投放分析等。

ClickHouse

ClickHouse 对比

ClickHouse是近年来备受关注的开源列式数据库,主要用于数据分析(OLAP)领域。目前国内社区火热,各个大厂纷纷跟进大规模使用:

  • 今日头条 内部用ClickHouse来做用户行为分析,内部一共几千个ClickHouse节点,单集群最大1200节点,总数据量几十PB,日增原始数据300TB左右。
  • 腾讯内部用ClickHouse做游戏数据分析,并且为之建立了一整套监控运维体系。
  • 携程内部从187月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求。
  • 快手内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB90%查询小于3S

在国外,Yandex内部有数百节点用于做用户点击行为分析,CloudFlare、Spotify等头部公司也在使用。ClickHouseOLAP场景需求出发,定制开发了一套全新的高效列式存储引擎,并且实现了数据有序存储、主键索引、稀疏索引、数据Sharding、数据Partitioning、TTL、主备复制等丰富功能。以上功能共同为ClickHouse极速的分析性能奠定了基础。

ClickHouse部署架构简单,易用,不依赖Hadoop体系(HDFS+YARN。它比较擅长的地方是对一个大数据量的单表进行聚合查询。ClickhouseC++实现,底层实现具备向量化执行(Vectorized Execution、减枝等优化能力,具备强劲的查询性能。目前在互联网企业均有广泛使用,比较适合内部BI报表型应用,可以提供低延迟(ms级别)的响应速度,也就是说单个查询非常快。但是Clickhouse也有它的局限性,在OLAP技术选型的时候,应该避免把它作为多表关联查询(JOIN)的引擎,也应该避免把它用在期望支撑高并发数据查询的场景,OLAP分析场景中,一般认为QPS达到1000+就算高并发,而不是像电商、抢红包等业务场景中,10W以上才算高并发,毕竟数据分析场景,数据海量,计算复杂,QPS能够达到1000已经非常不容易。例如Clickhouse,如果如数据量是TB级别,聚合计算稍复杂一点,单集群QPS一般达到100已经很困难了,所以它更适合企业内部BI报表应用,而不适合如数十万的广告主报表或者数百万的淘宝店主相关报表应用。Clickhouse的执行模型决定了它会尽全力来执行一个Query,而不是同时执行很多Query

Elasticsearch

ElasticSearch 架构

提到Elasticsearch,很多人的印象是这是一个开源的分布式搜索引擎,底层依托Lucene倒排索引结构,并且支持文本分词,非常适合作为搜索服务。这些印象都对,并且用Elasticsearch作为搜索引擎,一个三节点的集群,支撑1000+的查询QPS也不是什么难事,这是搜索场景。

但是,我们这里要讲的内容是Elasticsearch的另一个功能,即作为聚合(aggregation)场景的OLAP引擎,它与搜索型场景区别很大。聚合场景,可以等同于 select c1, c2, sum(c3), count(c4) from table where c1 in ('china', 'usa') and c2 < 100 这样的SQL,也就是做多维度分组聚合。虽然Elasticsearch DSL是一个复杂的JSON而不是SQL,但是意思相同,可以互相转换。

Elasticsearch作为OLAP引擎,有几项优势(1)擅长高QPS(QPS > 1K、低延迟、过滤条件多、查询模式简单(如点查、简单聚合)的查询场景(2)集群自动化管理能力(shard allocation,recovery)能力非常强。集群、索引管理和查看的API非常丰富。

ES的执行引擎是最简单的Scatter-Gather模型,相当于MapReduce计算模型的一趟MapReduceScatterGather之间的节点数据交换也是基于内存的不会像MapReduce那样每次Shuffle要先落盘。ES底层依赖的Lucene文件格式,我们可以把Lucene理解为一种行列混存的模式,并且在查询时通过FST,跳表等加快数据查询。这种Scatter-Gather模型的问题是,如果Gather/Reduce的数据量比较大,由于ES时单节点执行,可能会非常慢。整体来讲,ES是通过牺牲灵活性,提高了简单OLAP查询的QPS、降低了延迟。

Elasticsearch作为OLAP引擎,有几项劣势:多维度分组排序、分页。不支持Join。在做aggregation后,由于返回的数据嵌套层次太多,数据量会过于膨胀。ElasticSearchSolar也可以归为宽表模型。但其系统设计架构有较大不同,这两个一般称为搜索引擎,通过倒排索引,应用Scatter-Gather计算模型提高查询性能。对于搜索类的查询效果较好,但当数据量较大或进行扫描聚合类查询时,查询性能会有较大影响。

Presto

Presto 架构

Presto、Impala、GreenPlum均基于MPP架构,相比Elasticsearch、Druid、Kylin这样的简单Scatter-Gather模型,在支持的SQL计算上更加通用,更适合ad-hoc查询场景,然而这些通用系统往往比专用系统更难做性能优化,所以不太适合做对查询QPS(参考值QPS > 1000)、延迟要求比较高(参考值search latency < 500ms)的在线服务,更适合做公司内部的查询服务和加速Hive查询的服务。Presto还有一个优秀的特性是使用了ANSI标准SQL,并且支持超过30+的数据源Connector

Impala

ImpalaCloudera在受到GoogleDremel启发下开发的实时交互SQL大数据查询工具,是CDH平台首选的PB级大数据实时查询分析引擎。它拥有和Hadoop一样的可扩展性、它提供了类SQL(类Hsql)语法,在多用户场景下也能拥有较高的响应速度和吞吐量。它是由JavaC++实现的,Java提供的查询交互的接口和实现,C++实现了查询引擎部分,除此之外,Impala还能够共享Hive Metastore,甚至可以直接使用HiveJDBC jarbeeline等直接对Impala进行查询、支持丰富的数据存储格式(Parquet、Avro。此外,Impala没有再使用缓慢的Hive+MapReduce批处理,而是通过使用与商用并行关系数据库中类似的分布式查询引擎(由Query PlannerQuery CoordinatorQuery Exec Engine三部分组成,可以直接从HDFSHBase中用SELECTJOIN和统计函数查询数据,从而大大降低了延迟。Impala经常搭配存储引擎Kudu一起提供服务,这么做最大的优势是点查比较快,并且支持数据的UpdateDelete

Impala

Doris

Doris

Doris是百度主导的,根据Google Mesa论文和Impala项目改写的一个大数据分析引擎,在百度、美团团、京东的广告分析等业务有广泛的应用。Doris的主要功能特性如下所示:

  • 现代化MPP架构
    • 支持大规模数据集、集群灵活扩展
    • 支持高并发小查询
  • 强悍的SQL执行引擎、全新的预聚合技术
    • 支持亚秒级OLAP多维分析
    • 支持高效快速的多表关联分析
  • 基于LSM的列式存储引擎、MVCC事务隔离机制
    • 支持数据高效的实时导入
    • 支持数据批量、实时更新

Druid

Druid 架构

Druid是一种能对历史和实时数据提供亚秒级别的查询的数据存储。Druid支持低延时的数据摄取,灵活的数据探索分析,高性能的数据聚合,简便的水平扩展。Druid支持更大的数据规模,具备一定的预聚合能力,通过倒排索引和位图索引进一步优化查询性能,在广告分析场景、监控报警等时序类应用均有广泛使用;

Druid的特点包括:

  • Druid实时的数据消费,真正做到数据摄入实时、查询结果实时
  • Druid支持PB级数据、千亿级事件快速处理,支持每秒数千查询并发
  • Druid的核心是时间序列,把数据按照时间序列分批存储,十分适合用于对按时间进行统计分析的场景
  • Druid把数据列分为三类:时间戳、维度列、指标列
  • Druid不支持多表连接
  • Druid中的数据一般是使用其他计算框架(Spark)预计算好的低层次统计数据
  • Druid不适合用于处理透视维度复杂多变的查询场景
  • Druid擅长的查询类型比较单一,一些常用的SQL(groupby)语句在druid里运行速度一般
  • Druid支持低延时的数据插入、更新,但是比hbase、传统数据库要慢很多

与其他的时序数据库类似,Druid在查询条件命中大量数据情况下可能会有性能问题,而且排序、聚合等能力普遍不太好,灵活性和扩展性不够,比如缺乏Join、子查询等。

Kylin

Kylin自身就是一个MOLAP系统,多维立方体(MOLAP Cube)的设计使得用户能够在Kylin里为百亿以上数据集定义数据模型并构建立方体进行数据的预聚合。适合Kylin的场景包括:

  • 用户数据存在于Hadoop HDFS中,利用HiveHDFS文件数据以关系数据方式存取,数据量巨大,在500G以上
  • 每天有数G甚至数十G的数据增量导入
  • 10个以内较为固定的分析维度

简单来说,Kylin中数据立方的思想就是以空间换时间,通过定义一系列的纬度,对每个纬度的组合进行预先计算并存储。有N个纬度,就会有2N次种组合。所以最好控制好纬度的数量,因为存储量会随着纬度的增加爆炸式的增长,产生灾难性后果。

Kylin 架构

Links

上一页