如何打造一款极速数据湖分析引擎

简介:本文向读者详细揭秘了数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户进一步理解系统的架构。

作者:

阿里云 EMR 开源大数据 OLAP 团队

StarRocks 社区数据湖分析团队

前言

随着数字产业化和产业数字化成为经济驱动的重要动力,企业的数据分析场景越来越丰富,对数据分析架构的要求也越来越高。新的数据分析场景催生了新的需求,主要包括三个方面:

  • 用户希望用更加低廉的成本,更加实时的方式导入并存储任何数量的关系数据数据(例如,来自业务线应用程序的运营数据库和数据)和非关系数据(例如,来自移动应用程序、IoT 设备和社交媒体的运营数据库和数据)
  • 用户希望自己的数据资产受到严密的保护
  • 用户希望数据分析的速度变得更快、更灵活、更实时

数据湖的出现很好的满足了用户的前两个需求,它允许用户导入任何数量的实时获得的数据。用户可以从多个来源收集数据,并以其原始形式存储到数据湖中。数据湖拥有极高的水平扩展能力,使得用户能够存储任何规模的数据。同时其底层通常使用廉价的存储方案,使得用户存储数据的成本大大降低。数据湖通过敏感数据识别、分级分类、隐私保护、资源权限控制、数据加密传输、加密存储、数据风险识别以及合规审计等措施,帮助用户建立安全预警机制,增强整体安全防护能力,让数据可用不可得和安全合规。

为了进一步满足用户对于数据湖分析的要求,我们需要一套适用于数据湖的分析引擎,能够在更短的时间内从更多来源利用更多数据,并使用户能够以不同方式协同处理和分析数据,从而做出更好、更快的决策。本篇文章将向读者详细揭秘这样一套数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户进一步理解系统的架构。

之后我们会继续发表两篇文章,来更详细地介绍极速数据湖分析引擎的内核和使用案例:

  • 代码走读篇:通过走读 StarRocks 这个开源分析型数据库内核的关键数据结构和算法,帮助读者进一步理解极速数据湖分析引擎的原理和具体实现 。
  • Case Study 篇:介绍大型企业如何使用 StarRocks 在数据湖上实时且灵活的洞察数据的价值,从而帮助业务进行更好的决策,帮助读者进一步理解理论是如何在实际场景落地的 。

什么是数据湖?

什么是数据湖,根据 Wikipedia 的定义,“A data lake is a system or repository of data stored in its natural/raw format, usually object blobs or files”。通俗来说可以将数据湖理解为在廉价的对象存储或分布式文件系统之上包了一层,使这些存储系统中离散的 object 或者 file 结合在一起对外展现出一个统一的语义,例如关系型数据库常见的“表”语义等。

了解完数据湖的定义之后,我们自然而然地想知道数据湖能为我们提供什么独特的能力,我们为什么要使用数据湖?

在数据湖这个概念出来之前,已经有很多企业或组织大量使用 HDFS 或者 S3 来存放业务日常运作中产生的各式各样的数据(例如一个制作 APP 的公司可能会希望将用户所产生的点击事件事无巨细的记录)。因为这些数据的价值不一定能够在短时间内被发现,所以找一个廉价的存储系统将它们暂存,期待在将来的一天这些数据能派上用场的时候再从中将有价值的信息提取出来。然而 HDFS 和 S3 对外提供的语义毕竟比较单一(HDFS 对外提供文件的语义,S3 对外提供对象的语义),随着时间的推移工程师们可能都无法回答他们到底在这里面存储了些什么数据。为了防止后续使用数据的时候必须将数据一一解析才能理解数据的含义,聪明的工程师想到将定义一致的数据组织在一起,然后再用额外的数据来描述这些数据,这些额外的数据被称之为“元”数据,因为他们是描述数据的数据。这样后续通过解析元数据就能够回答这些数据的具体含义。这就是数据湖最原始的作用。

随着用户对于数据质量的要求越来越高,数据湖开始丰富其他能力。例如为用户提供类似数据库的 ACID 语义,帮助用户在持续写入数据的过程中能够拿到 point-in-time 的视图,防止读取数据过程中出现各种错误。或者是提供用户更高性能的数据导入能力等,发展到现在,数据湖已经从单纯的元数据管理变成现在拥有更加丰富,更加类似数据库的语义了。

用一句不太准确的话描述数据湖,就是一个存储成本更廉价的“AP 数据库”。但是数据湖仅仅提供数据存储和组织的能力,一个完整的数据库不仅要有数据存储的能力,还需要有数据分析能力。因此怎么为数据湖打造一款高效的分析引擎,为用户提供洞察数据的能力,将是本文所要重点阐述的部分。下面通过如下几个章节一起逐步拆解一款现代的 OLAP 分析引擎的内部构造和实现:

  • 怎么在数据湖上进行极速分析
  • 现代数据湖分析引擎的架构

怎么在数据湖上进行极速分析?

从这一节开始,让我们开始回到数据库课程,一个用于数据湖的分析引擎和一个用于数据库的分析引擎在架构上别无二致,通常我们认为都会分为下面几个部分:

  • Parser:将用户输入的查询语句解析成一棵抽象语法树
  • Analyzer:分析查询语句的语法和语义是否正确,符合定义
  • Optimizer:为查询生成性能更高、代价更低的物理查询计划
  • Execution Engine:执行物理查询计划,收集并返回查询结果

对于一个数据湖分析引擎而言,Optimizer 和 Execution Engine 是影响其性能两个核心模块,下面我们将从三个维度入手,逐一拆解这两个模块的核心技术原理,并通过不同技术方案的对比,帮助读者理解一个现代的数据湖分析引擎的始末。

RBO vs CBO

基本上来讲,优化器的工作就是对给定的一个查询,生成查询代价最低(或者相对较低)的执行计划。不同的执行计划性能会有成千上万倍的差距,查询越复杂,数据量越大,查询优化越重要。

Rule Based Optimization (RBO) 是传统分析引擎常用的优化策略。RBO 的本质是核心是基于关系代数的等价变换,通过一套预先制定好的规则来变换查询,从而获得代价更低的执行计划。常见的 RBO 规则谓词下推、Limit 下推、常量折叠等。在 RBO 中,有着一套严格的使用规则,只要你按照规则去写查询语句,无论数据表中的内容怎样,生成的执行计划都是固定的。但是在实际的业务环境中,数据的量级会严重影响查询的性能,而 RBO 是没法通过这些信息来获取更优的执行计划。

为了解决 RBO 的局限性,Cost Based Optimization (CBO) 的优化策略应运而生。CBO 通过收集数据的统计信息来估算执行计划的代价,这些统计信息包括数据集的大小,列的数量和列的基数等信息。举个例子,假设我们现在有三张表 A,B 和 C,在进行 A join B join C 的查询时如果没有对应的统计信息我们是无法判断不同 join 的执行顺序代价上的差异。如果我们收集到这三张表的统计信息,发现 A 表和 B 表的数据量都是 1M 行,但是 C 表的 数据量仅为 10 行,那么通过先执行 B join C 可以大大减少中间结果的数据量,这在没有统计信息的情况下基本不可能判断。

随着查询复杂度的增加,执行计划的状态空间会变的非常巨大。刷过算法题的小伙伴都知道,一旦状态空间非常大,通过暴力搜索的方式是不可能 AC 的,这时候一个好的搜索算法格外重要。通常 CBO 使用动态规划算法来得到最优解,并且减少重复计算子空间的代价。当状态空间达到一定程度之后,我们只能选择贪心算法或者其他一些启发式算法来得到局部最优。本质上搜索算法是一种在搜索时间和结果质量做 trade-off 的方法。

(常见 CBO 实现架构)

Record Oriented vs Block Oriented

执行计划可以认为是一串 operator(关系代数的运算符)首尾相连串起来的执行流,前一个 operator 的 output 是下一个 operator 的 input。传统的分析引擎是 Row Oriented 的,也就是说 operator 的 output 和 input 是一行一行的数据。

举一个简单的例子,假设我们有下面一个表和查询:

CREATE TABLE t (n int, m int, o int, p int); SELECT o FROM t WHERE m < n + 1; 

例子来源: GitHub - jordanlewis/exectoy

上述查询语句展开为执行计划的时候大致如下图所示:

通常情况下,在 Row Oriented 的模型中,执行计划的执行过程可以用如下伪码表示:

next: for: row = source.next() if filterExpr.Eval(row): // return a new row containing just column o returnedRow row for col in selectedCols: returnedRow.append(row[col]) return returnedRow 

根据 DBMSs On A Modern Processor: Where Does Time Go? 的评估,这种执行方式存在大量的 L2 data stalls 和 L1 I-cache stalls、分支预测的效率低等问题。

随着磁盘等硬件技术的蓬勃发展,各种通过 CPU 换 IO 的压缩算法、Encoding 算法和存储技术的广泛使用,CPU 的性能逐渐成为成为分析引擎的瓶颈。为了解决 Row Oriented 执行所存在的问题,学术界开始思考解决方案,Block oriented processing of Relational Database operations in modern Computer Architectures 这篇论文提出使用按 block 的方式在 operator 之间传递数据,能够平摊条件检查和分支预测的工作的耗时,MonetDB/X100: Hyper-Pipelining Query Execution 在此基础上更进一步,提出将通过将数据从原来的 Row Oriented,改变成 Column Oriented,进一步提升 CPU Cache 的效率,也更有利于编译器进行优化。在 Column Oriented 的模型中,执行计划的执行过程可以用如下伪码表示:

// first create an n + 1 result, for all values in the n column 
projPlusIntIntConst.Next(): batch = source.Next() for i < batch.n: outCol[i] = intCol[i] + constArg return batch // then, compare the new column to the m column, putting the result into 
// a selection vector: a list of the selected indexes in the column batch selectLTIntInt.Next(): batch = source.Next() for i < batch.n: if int1Col < int2Col: selectionVector.append(i) return batch with selectionVector // finally, we materialize the batch, returning actual rows to the user, 
// containing just the columns requested: materialize.Next(): batch = source.Next() for s < batch.n: i = selectionVector[i] returnedRow row for col in selectedCols: returnedRow.append(cols[col][i]) yield returnedRow 

可以看到,Column Oriented 拥有更好的数据局部性和指令局部性,有利于提高 CPU Cache 的命中率,并且编译器更容易执行 SIMD 优化等。

Pull Based vs Push Based

数据库系统中,通常是将输入的 SQL 语句转化为一系列的算子,然后生成物理执行计划用于实际的计算并返回结果。在生成的物理执行计划中,通常会对算子进行 pipeline。常见的 pipeline 方式通常有两种:

  • 基于数据驱动的 Push Based 模式,上游算子推送数据到下游算子
  • 基于需求的 Pull Based 模式,下游算子主动从上游算子拉取数据。经典的火山模型就是 Pull Based 模式。

Push Based 的执行模式提高了缓存效率,能够更好地提升查询性能。

参考:Push vs. Pull-Based Loop Fusion in Query Engines

现代数据湖分析引擎的架构

通过上一节的介绍,相信读者已经对数据湖分析引擎的前沿理论有了相应了解。在本节中,我们以 StarRocks 为例,进一步介绍数据湖分析引擎是怎么有机的结合上述先进理论,并且通过优雅的系统架构将其呈现给用户。

如上图所示,StarRocks 的架构非常简洁,整个系统的核心只有 Frontend (FE)、Backend (BE) 两类进程,不依赖任何外部组件,方便部署与维护。其中 FE 主要负责解析查询语句(SQL),优化查询以及查询的调度,而 BE 则主要负责从数据湖中读取数据,并完成一系列的 Filter 和 Aggregate 等操作。

Frontend

FE 的主要作用将 SQL 语句通过一系列转化和优化,最终转换成 BE 能够认识的一个个 Fragment。一个不那么准确但易于理解的比喻,如果把 BE 集群当成一个分布式的线程池的话,那么 Fragment 就是线程池中的 Task。从 SQL 文本到 Fragment,FE 的主要工作包含以下几个步骤:

  • SQL Parse:将 SQL 文本转换成一个 AST(抽象语法树)
  • Analyze:基于 AST 进行语法和语义分析
  • Logical Plan:将 AST 转换成逻辑计划
  • Optimize:基于关系代数,统计信息,Cost 模型对逻辑计划进行重写,转换,选择出 Cost “最低” 的物理执行计划
  • 生成 Fragment:将 Optimizer 选择的物理执行计划转换为 BE 可以直接执行的 Fragment
  • Coordinate:将 Fragment 调度到合适的 BE 上执行

Backend

BE 是 StarRocks 的后端节点,负责接收 FE 传下来的 Fragment 执行并返回结果给 FE。StarRocks 的 BE 节点都是完全对等的,FE 按照一定策略将数据分配到对应的 BE 节点。常见的 Fragment 工作流程是读取数据湖中的部分文件,并调用对应的 Reader (例如,适配 Parquet 文件的 Parquet Reader 和适配 ORC 文件的 ORC Reader等)解析这些文件中的数据,使用向量化执行引擎进一步过滤和聚合解析后的数据后,返回给其他 BE 或 FE。

总结

本篇文章主要介绍了极速数据湖分析引擎的核心技术原理,从多个维度对比了不同技术实现方案。为方便接下来的深入探讨,进一步介绍了开源数据湖分析引擎 StarRocks 的系统架构设计。希望和各位同仁共同探讨、交流。

附录

基准测试

本次测试采用的 TPCH 100G 的标准测试集,分别对比测试了 StarRocks 本地表,StarRocks On Hive 和 Trino(PrestoSQL) On Hive 三者之间的性能差距。

在TPCH 100G规模的数据集上进行对比测试,共22个查询,结果如下:

StarRocks 使用本地存储查询和 Hive 外表查询两种方式进行测试。其中,StarRocks On Hive 和 Trino On Hive 查询的是同一份数据,数据采用 ORC 格式存储,采用 zlib 格式压缩。测试环境使用 阿里云 EMR 进行构建。

最终,StarRocks 本地存储查询总耗时为21s,StarRocks Hive 外表查询总耗时92s。Trino 查询总耗时307s。可以看到 StarRocks On Hive 在查询性能方面远远超过 Trino,但是对比本地存储查询还有不小的距离,主要的原因是访问远端存储增加了网络开销,以及远端存储的延时和 IOPS 通常都不如本地存储,后面的计划是通过 Cache 等机制弥补问题,进一步缩短 StarRocks 本地表和 StarRocks On Hive 的差距。

参考资料

[1] GitHub - jordanlewis/exectoy

[2] DBMSs On A Modern Processor: Where Does Time Go?
[3] Block oriented processing of Relational Database operations in modern Computer Architectures

[4] MonetDB/X100: Hyper-Pipelining Query Execution

[5] StarRocks - 开源大数据平台E-MapReduce - 阿里云

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Linux 命令行中按大小对文件进行排序

作者 | 刘光录来源 | TIAPls 命令用于显示目录的内容。使用 -l 选项&#xff0c;可以列出文件和目录及其属性。今天我们来分享一下如何根据文件大小对列表进行排序。ls -l 命令可以显示文件大小&#xff0c;但也仅仅是能让我们看到文件的大小&#xff0c;它默认是按照字母顺序显…

福建品品香茶业有限公司业务迁移上云

福建品品香茶业有限公司数据量较大&#xff0c;进行业务迁移上云时阿里云根据其公司需求综合考虑&#xff0c;推荐将原有IOE架构改为分布式架构&#xff0c;使用ECSRDS承载业务&#xff0c;为客户带来极大价值。 企业介绍 福建品品香茶业有限公司是一家集茶叶种植、加工、销售…

璀璨智行:V2X车路协同智慧交通

V2X车用无线通信技术是指车对外界的信息交换&#xff0c;作为未来智能交通运输系统的关键技术&#xff0c;璀璨智行潜心研究V2X技术&#xff0c;致力于V2X车路协同的落地&#xff0c;在智慧交通领域做出了卓越的贡献。 创业机会点 魏军博表示&#xff1a;“面对交通系统效率低…

Databricks 企业版 SparkDelta Lake 引擎助力 Lakehouse 高效访问

简介&#xff1a;本文介绍了Databricks企业版Delta Lake的性能优势&#xff0c;借助这些特性能够大幅提升Spark SQL的查询性能&#xff0c;加快Delta表的查询速度。 作者&#xff1a; 李锦桂&#xff08;锦犀&#xff09; 阿里云开源大数据平台开发工程师 王晓龙&#xff08…

深度解析数据湖存储方案Lakehouse架构

简介&#xff1a;从数据仓库、数据湖的优劣势&#xff0c;湖仓一体架构的应用和优势等多方面深度解析Lakehouse架构。 作者&#xff1a;张泊 Databricks 软件工程师 Lakehouse由lake和house两个词组合而成&#xff0c;其中lake代表Delta Lake&#xff08;数据湖&#xff09;&…

1688 复杂业务场景下的 Serverless 提效实践

简介&#xff1a;我们主要负责 PC 端 1688.com 以及手机端阿里巴巴 APP&#xff0c;是目前国内最大的 B 类电商交易平台&#xff0c;主要面向 B2B 电商业务的场景&#xff0c;为中小企业提供零售、批发、分销以及加工定制等电商交易渠道。 前言 首先为大家简单介绍一下我们的…

阿里 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

简介&#xff1a;经历近 3 年时间&#xff0c;在阿里集团及蚂蚁集团共建小组的努力下&#xff0c;OpenSumi 作为国内首个强定制性、高性能&#xff0c;兼容 VS Code 插件体系的 IDE 研发框架&#xff0c;今天正式对外开源。 作者 | OpenSumi 来源 | 阿里技术公众号 经历近 3 …

剖析 kubernetes 集群内部 DNS 解析原理

作者 | 江小南来源 | 江小南和他的小伙伴们引言说到DNS域名解析&#xff0c;大家想到最多的可能就是/etc/hosts文件&#xff0c;并没有什么错&#xff0c;但是/etc/hosts只能做到本机域名解析&#xff0c;如果跨机器的解析就有点捉襟见肘了。在服务器中还有一个配置值得大家注意…

首次公开,阿里云开源PolarDB总体架构和企业级特性

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家北侠带来了主题为《PolarDB 总体架构设计和企业级特性》的精彩演讲。 在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家 北…

阿里云数据库开源发布:PolarDB HTAP的功能特性和关键技术

简介&#xff1a;在3月2日的阿里云开源 PolarDB 企业级架构发布会上&#xff0c;阿里云 PolarDB 内核技术专家严华带来了主题为《PolarDB HTAP详解》的精彩演讲。在PolarDB存储计算分离架构的基础上&#xff0c;我们研发了基于共享存储的MPP分布式执行引擎&#xff0c;解决了单…

倒计时 2 天!2022 中国算力大会:移动云邀您共见算力网络,创新发展

7 月 29 日 - 31 日由工业和信息化部、山东省人民政府主办的首届中国算力大会将在泉城济南盛大举行&#xff01;中国移动受邀承办“算力网络&#xff0c;创新发展” 论坛并设立展区分享行业前瞻洞察&#xff0c;构建开放共赢生态7 月 29 日下午&#xff0c;邀您共话算力精彩&am…

什么是好的错误消息? 讨论一下Java系统中的错误码设计

简介&#xff1a;一个好的Error Message主要包含三个部分&#xff1a;Context: 什么导致了错误&#xff1f;发生错误的时候代码想做什么&#xff1f;The error itself: 到底是什么导致了失败&#xff1f;具体的原因和当时的数据是什么&#xff1f;Mitigation: 有什么解决方案来…

阿里巴巴在开源压测工具 JMeter 上的实践和优化

简介&#xff1a;Apache JMeter 是 Apach 旗下的开源压测工具&#xff0c;创建于 1999 年初&#xff0c;迄今已有超过 20 年历史。JMeter 功能丰富&#xff0c;社区&#xff08;用户群体&#xff09;庞大&#xff0c;是主流开源压测工具之一。 作者&#xff1a;灵苒、涧泉 Ap…

普洛斯荣获两项“数据中心绿色等级评估”5A级认证

7月29日&#xff0c;由工业和信息化部及山东省人民政府主办的首届中国算力大会在济南成功举办&#xff0c;会上同时公布了本年度“数据中心绿色等级评估”评审结果。普洛斯常熟东南数据中心B栋及普洛斯怀来数据中心3号楼均荣获“数据中心绿色等级评估”&#xff08;规划类/基础…

深度解读企业云上办公利器「无影云电脑」

简介&#xff1a;信息化进程高速发展的今天&#xff0c;用户桌面办公的需求正不断发生变化&#xff1a;远程办公&#xff0c;BYOD的需求不断增长&#xff1b;快速交付&#xff0c;高效运维的需求接连上升&#xff1b;数据及网络安全的关注度持续提高&#xff1b;整体办公成本在…

云风:不加班、不炫技,把复杂的问题简单化

小学时跟随母亲去成人大学学习编程&#xff0c;初中开始参加信息学奥赛&#xff0c;高中写出人生中第一个成熟软件——Cview&#xff0c;大学发布开源软件风魂系列&#xff0c;后用于网易开发的《大话西游》《梦幻西游》等热门游戏&#xff0c;离开网易创立简悦科技……随着云风…

Timing:在线自习室快速搭建

通过超低延迟的音视频通信技术、视频连麦、弱网传输算法&#xff0c;快速搭建自习场景&#xff0c;提升自习效率。 客户简介 氪细胞主打产品Timing&#xff0c;是国内最早推出&#xff0c;也是规模最大的在线自习室&#xff0c;是新一代的教育与社交融合平台&#xff0c;主打高…

Nacos2.0的K8s服务发现生态应用及规划

简介&#xff1a;Nacos 是阿里巴巴于 2018 年开源的注册中心及配置中心产品&#xff0c;帮助用户的分布式微服务应用进行服务发现和配置管理功能。随着 Nacos2.0 版本的发布&#xff0c;在性能和扩展性上取得较大突破后&#xff0c;社区开始考虑如何提供更加云原生方向的功能和…

webview 和 React Native 中吸顶效果实现

作者 | &#x1f47d;来源 | Sharing一、前言 在跨端开发中&#xff0c;离不开一些吸顶的交互场景&#xff0c;可以参考淘宝或是京东类电商 app 中一些 tab &#xff0c;在整个容器滑动的过程中&#xff0c;吸顶效果非常的连贯和丝滑的&#xff0c;当然这些 tab 可能是用 nativ…

AHPA:开启 Kubernetes 弹性预测之门

简介&#xff1a;阿里巴巴云原生团队和阿里达摩院决策智能时序团队合作开发 AHPA 弹性预测产品&#xff0c;该产品主要出发点是基于检测到的周期做“定时规划”&#xff0c;通过规划实现提前扩容的目的&#xff0c;在保证业务稳定的情况下&#xff0c;让你真正实现按需使用。 …