在前文 BI系统与ClickHouse:探索式BI的OLAP技术演进之路 中已经涉及过OLAP的概念,这里再简要介绍下。
60年代,关系型数据库之父E.F.Codd提出了关系模型,促进了OLTP( OnLine Transaction Processing,联机事务处理)模型的发展。
1993年,E.F.Codd提出了OLAP(OnLine Analytical Processing,联机分析处理)概念,认为OLTP已不能满足终端用户对数据库查询分析的需要,SQL对大型数据库进行的简单查询也不能满足终端用户分析的要求。用户的决策分析需要对关系数据库进行大量计算才能得到结果,而查询的结果并不能满足决策者提出的需求。因此,E.F.Codd提出了多维数据库和多维分析的概念,即OLAP。
OLAP技术发展至今,已经是”百花齐放“之势:ROLAP(Relational OLAP,关系型OLAP)和MOLAP(Multidimensional OLAP,多维型 OLAP)两大流派各有建树;MPP(Massively Parallel Processing, 大规模并行处理)技术推陈出新。 本文首先为大家梳理下主流OLAP开源技术框架,让读者可以快速了解各种引擎特点。
SQL on Hadoop 的原理
讨论OLAP就不得不提 SQL on Hadoop, SQL on Hadoop系统是一类系统的统称,这类系统利用Hadoop实现大量数据的管理,具体是利用HDFS 实现高度可扩展的数据存储。在HDFS之上,实现SQL的查询引擎,使得用户可以使用SQL语言,对存储在HDFS上的数据进行分析。这实际上是一套计算和存储分离的方案,大名鼎鼎的MapReduce就是其基石。
Join 的实现原理
select u.name, o.orderid from order o join user u on o.uid = u.uid;
Group By 的实现原理
select rank, isonline, count(*) from city group by rank, isonline;
为了提高SQL on Hadoop的性能,第一个重要技术流派的就是MPP。MPP (Massively Parallel Processing),即大规模并行处理,在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。
简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。 其中的代表就是 Presto & Impala。
Presto 是 Facebook 推出分布式SQL交互式查询引擎,完全基于内存的并行计算。其架构图如下:
Presto比Hive快的原因就在于不在落盘,而是全内存操作。
PrestoDB / PrestoSQL(Trion)
最早 Presto 由 Facebook 公司开源,Github链接为 https://github.com/prestodb/presto。但是因为 Facebook对 Presto 相关开发优先级为公司内部需求为主,导致社区活跃性和很多 Issues 得不到及时解决。
2019 年 Facebook 内部主要负责 Presto 的人单独出来成立了新公司。社区也重新创建,Github链接为 https://github.com/prestosql/presto。由 Facebook 主力维护的 Presto 称为 PrestoDB,从 Facebook 分道 扬镳出来的叫 PrestoSQL。
直到2020年底,Presto 品牌之争虽然以 PrestoDB 胜出落下了帷幕,PrestoSQL 改名为 Trion,GitHub 地址为
https://github.com/trinodb/trino
PrestoDB 和 PrestoSQL(Trion)的比较(2020.5):
http://armsword.com/2020/05/02/the-difference-between-prestodb-and-prestosql/
Presto的优缺点
优势:
缺点:
Impala 是 Cloudera 在受到 Google 的 Dremel 启发下开发的实时交互SQL大数据查询工具,其也是基于内存的并行计算框架且强依赖与HIVE生态。
Impala的优缺点
优势
缺点
Drill: Drill 是2012年,MapR 公司开源的一个低延迟的大数据集的分布式SQL查询引擎,是谷歌Dremel的开源实现。它支持对本地文件、HDFS、HBASE等数据进行数据查询。它与同是源自 Dremel 的 Impala 比较类似。
HAWQ:HAWQ(Hadoop With Query) 是 Pivotal 公司开源的一个 Hadoop 原生大规模并行SQL分析引擎,基于 GreenPlum 实现,采用主从改进MPP架构,将MPP与批处理系统有效的结合。
MPP技术的底层逻辑还是基于ROLAP出发的,另一个角度就是MOLAP(Multidimensional OLAP,多维型 OLAP)。它的出现是为了缓解ROLAP性能问题。MOLAP使用多维数组的形式保存数据,其核心思想是借助预先聚合结果,用更多的存储空间换得查询时间的减少。其中集大成则就是Kylin.
Kylin 是2014年由 eBay 中国研发中心开源的OLAP引擎,提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析能力以支持超大规模数据,它能在亚秒内查询巨大的Hive表。其核心技术点在于预计算和Cube(立方体模型)的设置:首先, 对需要分析的数据进行建模,框定需要分析的维度字段;然后通过预处理的形式,对各种维度进行组合并事先聚合;最后,将聚合结果以某种索引或者缓存的形式保存起来(通常只保留聚合后的结果,不存储明细数据)。这样一来,在随后的查询过程中,就可以直接利用结果返回数据。
维度预处理可能会导致数据膨胀。为了减少cube的计算量就需要cube剪枝。
Kylin的优缺点
优势
缺点
Druid是由广告公司 MetaMarkets 于2012年开源的实时大数据分析引擎.
Druid 作为MOLAP引擎,也是对数据进行预聚合。只不过预聚合的方式与Kylin不同,Kylin是Cube化,Druid的预聚合方式只是全维度进行Group-by,相当于是Kylin Cube 的 base cuboid。
更多关于Kylin和Druid的对比:https://www.shulanxt.com/doc/encyc/cy-dkdb
Druid的优缺点:
优势
缺点
如果单纯从模型角度考虑,和MOLAP相比,很明显ROLAP架构更胜一筹。因为关系模型拥有最好的“群众基础”,也更简单且容易理解。它直接面向明细数据查询,由于不需要预处理,也就自然没有预处理带来的负面影响(维度组合爆炸、数据实时性、更新问题)。
那是否存在这样一种技术,它既使用ROLAP模型,同时又拥有比肩MOLAP的性能呢? 答案就是MPPDB。
在前文六千字呕心沥血深度总结,为您揭秘ClickHouse为什么查询这么快 中,笔者已经深入介绍了CH的特性,这里不再赘述,只是简单总结下其优缺点:
优势
缺点
Apache Doris是由百度开源的一款MPP数据库,实现了MySQL协议,集成Google Mesa 和Apache Impala 的技术。
DorisDB是基于 Apache Doris 做的闭源商业化产品,后该产品又基于Elastic License 2.0开源并更名为StarRocks。
关于这两家的一些历史纠葛,可以参考
Apache Doris声明: ApacheDoris:你们想知道的 一切,都在这里了。 https://zhuanlan.zhihu.com/p/408644772StarRocks回应: 关于StarRocks相关疑问的解答 https://mp.weixin.qq.com/s/r8pL5v2Yw1l9iQxhDWaW3w
Doris的优缺点:
优势
缺点
细心的读者可以已经发现了,上面的提到的技术都是在特定场景下增强的,单有的时候我们其实场景还不是很明确,有没有稍微通用的“万金油”方案,方便我们以后扩展和演进呢,这就需要回到Hadoop生态的通用方案了。
由 Facebook 开源,用于解决海量日志数据的分析,是一个构建于Hadoop顶层的数据仓库工具。
Spark是UC Berkeley AMP lab开源的类MapReduce的通用的并行计算框架。SparkSQL 是 Spark 处理结构化数据的模块。本质上也是基于 DAG (有向无环图,Directed Acyclic Graph的缩写,常用于建模) 的 MPP。
SparkSQL的优缺点
优势
缺点
说了这么多,到底该怎么选择呢?正所谓“一图胜千言”,笔者直接给出决策路径。
Presto特别适合小型Query,Presto对小型任务也有比较好的性能表现。
维度不确定的即席查询(adhoc),满足秒级或分钟级返回。
一般用于报表(BI报表、自定义报表),数据质量检测,活动营销。
Aapche Impala强依赖于CDH的生态,Apache Drill和Apache HAWQ社区都不太活跃。因此现在Presto风头强于 Impala;
个人理解可以认为是Presto的加速版,一站式OLAP实时分析数据库。
数据不直接依赖HDFS,接受MySQL标准,有适量join和大量聚合操作。
一般用于新业务场景,无Hadoop数仓历史背景,一站式OLAP数据库和实时数据仓库
Apache Doris和ClickHouse的深度分析:https://zhuanlan.zhihu.com/p/421469439
超大规模复杂多表数据分析,数仓ETL,自定义复杂作业和python数据科学;
数据存在HDFS或其他数据湖,标准Hive数仓,T+1场景和其他非实时分析。
一般用于其他OLAP引擎的Fallback,数仓ETL不二之选,机器学习相关的数据分析,数据科学。
“世间没有万全策”。高性能OLAP技术虽然足够优秀,但也不是万能的,我们还需根据实践情况组合使用。下面读者将从几个实战落地场景介绍下OLAP的应用。
方案分析:
提供面向数据湖场景的数据分析和计算能力,主打数据湖分析和联邦分析两个场景。
DLA 提供了 SQL (Presto) 计算引擎和 Spark计算引擎,无论是 SQL还是Spark引擎,都和 Meta data catalog 深度集成,能方便的获取元数据信息。基于 Presto,DLA 可以支持 Ad-hoc Query。基于 Spark ,DLA 支持批处理、流计算和机器学习等计算模式。
和阿里DLA类似
推荐系统实时指标
无论字节还是在快手内部,“AB实验”应用非常广泛,特别是在验证推荐算法和功能优化的效果方面。 而推荐系统需要更快地观察算法模型、或者某个功能的上线效果,因此需要一份能够实时反馈的数据作为补充(需求):
方案分析
广告投放实时数据场景
场景需求特点:
方案分析
最后的最后,笔者根据个人经验和目前看到的行业发展趋势,将上文的决策路径再次简化,仅代表一家之言。