“ 作者:阿里云EMR开源大数据OLAP团队, StarRocks 社区数据湖分析团队”
前言
数字产业化和产业数字化成为经济驱动的重要动力,企业的数据分析场景越来越频繁,对数据分析的要求也越来越高。新的数据分析场景催生了新的需求,主要包括三个方面:
- 用户希望使用统计数据的方式和数据来自的报价,并实时存储任何的数据(例如,在线应用程序的运营数据)和非数据(例如,移动应用程序、物联网设备关系社交)媒体的运营数据库和数据)
- 用户希望自己的数据资产受到严密的保护
- 用户希望数据灵活分析的更快、更灵活、更实时
数据湖的出色满足满足了两个需求,它允许湖用户导入任何数量的数据。从源头收集数据,并可以从用户中实时出现的多个数据形式存储到其中。具有极高数据能力的存储能力,普通消费者可以通过任何规模的存储功能来保护用户的价值,并降低其智能识别、数据分类、隐私、资源的价值。控制、数据加密加密传输、加密存储、数据风险识别以及合规审计等措施,帮助用户建立安全预警机制,增强整体安全能力,让数据可用得和安全合规。
为进一步满足用户对数据湖分析的要求,我们需要配备适用于数据湖分析的引擎,在更短的时间内更多地利用更多数据,于用户更能处理数据和分析不同的协同方式进一步的数据,确定更好的决策,做出更好的决策。本篇文章将向读者详细揭晓这样安排数据湖分析引擎的关键技术,并通过 StarRocks 来帮助用户理解系统的架构。
之后会发表文章,来更详细地极速数据湖分析引擎的两篇文章的介绍和我们继续使用案例:
- 代码走读篇:通过走读 StarRocks 这个开源分析型数据库内核的关键数据结构和算法,帮助进一步了解极速数据湖分析引擎的原理和具体实现。
- 案例研究篇:灵活的大型企业使用 StarRocks 数据湖上实时的帮助如何帮助洞察数据的价值,从而更好地在业务中进行决策,进一步深入理论是在实际场景中介绍落地的。
什么是数据湖
什么是数据湖,根据维基百科的定义,“数据湖是以自然/原始格式存储的数据的系统或存储库,通常是对象 blob 或文件”。通俗来说可以将数据湖理解为在廉价的对象存储中或者是一张表格的表格,显示这些包裹类型中的某个对象,或者说是“典型的系统关系表”等。
了解完数据湖的定义之后,我们而然地想知道数据湖自然运行我们为什么要提供什么独特的数据湖的能力,我们要使用什么?
例如在数据湖这个概念出现之前,已经有很多或组织大量使用 HDFS 或者 S3 来提供各企业日常生产的各种类型的数据,用户可能会希望将这些数据(一个制作 APP 的公司可能会希望将其点击事件无这些巨细的数据能够在暂存现场的存储,的价值系统将它们,而当时的一天数据,因此能够再寻找一个潜在的结果。然而,HDFS的今天3个晚上提供时间的全面覆盖率。为阻止数据显示使用这些数据的时间,数据将一解析理解数据的含义,聪明的工程师将再定义这些数据,然后再使用这些数据描述。额外的这些数据能够描述它们的具体数据是这样的数据,原因是通过解析数据的元数据就可以回答。
例如用户提供类似数据库的 ACID 为其他数据过程的数据,帮助用户在持续中要求能够及时获取数据的数据质量。能力,读取过程中的数据能力,正在为用户提供更高的数据导入数据管理,数据湖已经从表面上变成了经验丰富,现在更多的数据现在出现了各种错误了。
用一句就是准确的数据描述数据湖,一个存储成本更便宜的“数据库”。但是,一个完整的数据湖提供了数据存储和组织能力的数据库,但还需要提供数据存储能力。分析如下数据能力如何。的内部构造和实现:
- 怎么在数据湖上进行极速分析
- 现代数据湖分析引擎的架构
怎么在数据湖上进行极速分析
这一节开始,让我们开始从数据库中返回,一个用于数据湖的分析引擎和一个数据库认为的分析引擎在架构上别无二,通常我们会分为以下几个部分:
- Parser:将荟萃解析解析成一个用户输入的语法树的查询语句
- 分析语句的语法和分析器是否正确,符合查询定义
- 优化器为查询性能、查询性能查询计划
- 执行引擎:执行物理查询计划,收集并返回查询结果
相对而言,优化器和执行引擎是其性能内核模块,我们通过一个不同的湖面特性分析手,分别解解这两个模块的不同特性,并分别分解这两个技术的比对,帮助读者理解一个现代的数据湖分析引擎的始末。
RBO 与 CBO
优化器的工作就是执行的一个,显示查询最低(或者相对较低)的执行任务。量,优化查询越重要。
RBO 的核心是基于规则分析引擎的常用优化策略。在RBO中查询下你的使用规则,只要按照规则去写日程,数据表中的内容如何,??生成的执行都如何但在实际的环境中,数据的量级会严重影响查询的性能,而 RBO 是无法通过这些信息来获取更优的业务执行计划。
RBO 的统计信息和统计信息最优化(C)的优化(C)的优化而生。举个例子,假设我们现在有三张表 A,B 和 C,在进行 A 加入 B 加入 C 的查询时,如果没有的统计信息我们是无法判断不同加入的执行顺序上的差异。我们减少这张表的统计,但是A表和B发现的数据都是1M行,C表的数据收集到的数据量是先通过10行,然后执行B加入C的可以大中间结果的数据量,这在没有统计信息的情况下绝对可以判断。
刷过题的小伙伴都知道,状态空间的增加,执行计划的状态空间会很大。的搜索算法的不同空间状态重要。CBO的使用动态规划算法得出最优解,并且减少重复空间的典型程度。当达到一定程度之后,我们选择贪心或者其他一些启发式的算法来计算子节点最佳。搜索时间上搜索结果和结果算法是在搜索质量上做权衡的方法。
(常见CBO实现架构)
面向记录与面向块
执行执行关系(代数的输入是一个操作员的计划首尾执行)认为执行关系,前操作员的输出是下操作员的传统操作员的输出。和输入是一行一行的数据。
举一个简单的例子,假设我们有下面的表格和查询:
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):
returnedRow row
for col in selectedCols:
returnedRow.append(row[col])
return returnedRow
根据现代处理器上的 DBMS:时间去哪儿了?的评估,这种执行方式存在大量的 L2 数据停顿和 L1 I-cache 停顿、分支预测的效率低等问题。
计算机等硬件技术的萌芽发展,通过 CPU 算法 IO 的压缩编码算法和存储技术、编码算法、存储技术的各种使用,CPU 的性能普遍成为分析所需要的各种问题。学术界开始考虑,面向块的关系型数据库操作在现代计算机体系结构中的主题方式以块操作员的方式在操作员,能够平摊条件下的数据处理和预测分支的工作模式之间的解决方案,MonetDB/ X100: Hyper-Pipelining Query Execution 在此基础上更进一步,建议将通过将从原来的 Row Oriented,改变成 Column Oriented,提升 CPUCache 的数据效率,进而进一步编译器进行优化。在 Column Oriented 中模型中,执行计划的执行过程可以用如下伪码表示:
projPlusIntIntConst.Next():
batch = source.Next()
for i < batch.n:
outCol[i] = intCol[i] + constArg
return batch
selectLTIntInt.Next():
batch = source.Next()
for i < batch.n:
if int1Col < int2Col:
selectionVector.append(i)
return batch with selectionVector
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
可以看到,面向对象的类型和拥有 CPU 的缓存性更好,可以提高数据性能的目标,并且编译器更容易执行 SIM 等。
基于拉取与基于推送
生成的物理执行计划中的计算结果,通常在计算子进程中用于计算结果,然后生成物理执行计划中的计算结果并进行流水线处理。管道方式通常有:
- 驱动数据的推送子基于基于数据模式的计算子
- 经典的基于拉取模式的模式,下游模型主动从基于拉模式的拉取模式中提取数据。
Push Based 的能力模式提高了性能查询性能,执行更好的地提升。
参考:查询引擎中的推送与基于拉取的循环融合
现代数据湖分析引擎的架构
通过上一节的介绍,已经在数据湖分析引擎的引擎的最新理论有了相应的了解。通过的优雅系统架构将其呈现给用户。
如上图显示了任何依赖关系的非常基础,整个系统包含前端(FE)的前端、核心组件,不包含任何核心组件,不方便部署与主要解析。 ,优化以及查询的调度,而 BE 则主要负责从数据湖中读取数据,并完成查询和汇总等操作。
前端
FE 的声明表会生成和转换一个 SQL 语句,最终成为一个片段的话。从 SQL 文本到 Fragment,FE 的主要工作包含以下几个步骤:
- SQL Parse:将文本转换成一个 AST SQL 抽象树语法
- 分析:基于AST进行语法和分析
- 逻辑计划:将AST转换成逻辑计划
- 优化:根据关系代数,最低统计信息,对逻辑计划进行计算,转换成本,选择“成本”的物理计划
- 生成 Fragment:将 Optimizer 选择的物理执行计划转换为 BE 可以直接执行的 Fragment
- 坐标:将Fragment调度到合适的BE上执行
后端
StarRocks 的 BE 节点传下来,负责返回的 Fragment 接收结果给 FE。是读取数据湖中的这些部分,调用读取器并引擎过滤过滤 Parquet 读取器(Parquet Reader 和例如文件 ORC 读取器等文件)解析文件中的数据,使用相互化执行进一步的数据和聚合解析后的数据后,返回给其他 BE 或 FE。
总结
本篇文章主要介绍了极速数据分析引擎的核心技术原理,从多维度对比了不同的技术方案实现。为方便下湖的深入探讨,进一步介绍了开源数据分析引擎 StarRocks 的系统架构设计。和各位仁慈共同探讨、交流。
附录
基准测试
本次测试采用了 TPCH 100G 的标准测试集,分别对比测试了 StarRocks 本地表,StarRocks On Hive 和 Trino(PrestoSQL) On Hive 三者之间的性能差距。
在TPCH 100G规模的数据集上进行对比测试,共22个查询,结果如下:
StarRocks 本地存储查询和 Hive 使用阿里云定位查询方式进行测试。其中,StarRocks On Hive 查询同一个数据,数据采用 ORC 组织,采用 zlib 格式压缩。测试环境 存储进行使用格式压缩。
最终,Trino 定位查询总查询为三方定位查询,三方定位查询总查询为三方定位查询,定位定位总查询查询 9 定位查询。2 定位查询。定位查询 2 定位查询。查询定位查询 2 个定位查询。 查询定位查询 2 个定位查询。远程监控是远程监控和远程监控以及远程监控和远程监控的主要任务,主要是通过远程监控和远程监控以及远程监控的主要任务是 IO 本地表、远程监控和远程监控等重要任务StarRocks On Hive 的差距。
|