探究resto引擎浅析oin腾讯云开发者社区

作者:vivo互联网技术-Shuai Guangying

本次带来的是系列文章的第2篇,本文梳理了Join的原理,以及Join算法在Presto中的实现思路。通过理论和实践的结合,可以在理解原理的基础上,更加深入理解Join算法在OLAP场景下的工程落地技巧,比如火山模型,列式存储,批量处理等思想的应用。

在业务开发中使用数据库,通常会有规范不允许过多表的Join。例如阿里巴巴开发手册中,有如下的规定:

【强制】超过三个表禁止Join。需要Join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。说明:即使双表Join也要注意表索引、SQL性能。

在大数据数仓的建设中,尽管我们有星型结构和雪花结构,但是最终交付业务使用的大多是宽表。

可以看出业务使用数据库中的一个矛盾点:我们需要Join来提供灵活的关联操作,但是又要尽量避免多表和大表Join带来的性能问题。这是为什么呢?

在数据库中Join提供的语义是非常丰富的。简单总结如下:

通常理解Join的实现原理,从Cross Join是最好的切入点,也就是所谓的笛卡尔积。对于集合进行笛卡尔积运算,理解非常简单,就是穷举两个集合中元素所有的组合情况。在数据库中,集合就对应到数据表中的所有行(tuples),集合中的元素就对应到单行(tuple)。所以实现Cross Join的算法也就呼之欲出了。

实现的代码样例如下:

可以看出实现逻辑非常简单,就是两个For循环嵌套。

在这个基础上,实现Inner Join的第一个算法就顺其自然了。非常直白的名称:Nested Loop,实现关键点如下:

其中,θ操作符可以是:=, !=, <, >, ≤, ≥。

相比笛卡尔积的实现思路,也就是添加了一层if条件的判断用于过滤满足条件的组合。

对于Nested Loop算法,最关键的点在于它的执行效率。假如参与Join的两张表一张量级为1万,一张量级为10w,那么进行比较的次数为1w*10w=10亿次。在大数据时代,通常一张表数据量都是以亿为单位,如果使用Nested Loop Join算法,那么Join操作的比较次数直接就是天文数字了。所以Nested Loop Join基本上是作为万不得已的保底方案。Nested Loop这个框架下,常见的优化措施如下:

值得一提的是Nested Loop Join的思想虽然非常朴素,但是天然的具备分布式、并行的能力。这也是为什么各类NoSQL数据库中依然保留Nested Loop Join实现的重要一点。虽然单机串行执行慢,但是可以并行化的话,那就是加机器能解决的问题了。

通过前面的分析可以知道,Nested Loop Join算法的关键问题在于比较次数过多,算法的复杂度为O(m*n),那么突破口也得朝着这个点。如果集合中的元素是有序的,比较的次数会大幅度降低,避免很多无意义的比较运算。对于有序的所以Join的第二种实现方式如下所描述:

通过将JOIN操作拆分成Sort和Merge两个阶段实现Join操作的加速。对于Sort阶段,是可以提前准备好可以复用的。这样的思想对于MySQL这类关系型数据库是非常友好的,这也能解释阿里巴巴开发手册中要求关联的字段必须建立索引,因为索引保证了数据有序。该算法时间复杂度为排序开销O(mlog(m)+nlog(n))+合并开销O(m+n)。但是通常由于索引保证了数据有序,索引其时间复杂度为O(m+n)。

Sort Merge Join的思想在落地中有一定的限制。所谓成也萧何败萧何,对于基于Hadoop的数仓而言,保证数据存储的有序性这个点对于性能影响过大。在海量数据的背景下,维护索引成本是比较大的。而且索引还依赖于使用场景,不可能每个字段都建一个索引。在数据表关联的场景是大表关联小表时,比如:用户表(大表)--当日订单表(小表);事实表(大表)–维度表(小表),可以通过空间换时间。回想一下,在基础的数据结构中,tree结构和Hash结构可谓数据处理的两大法宝:一个保证数据有序方便实现区间搜索,一个通过hash函数实现精准命中点对点查询效率高。

在这样的背景下,通过将小表Hash化,实现Join的想法也就不足为奇了。

而且即使一张表在单机环境生成Hash内存消耗过大,还可以利用Hash将数据进行切分,实现分布式能力。所以,在Presto中Join算法通常会选择Hash Join,该算法的时间复杂度为O(m+n)。

通过相关资料的学习,可以发现Join算法的实现原理还是相当简单的,排序和Hash是数据结构最为基础的内容。了解了Join的基本思想,如何落地实践出来呢?毕竟talk is cheap。在项目中实现Join之前,需要一些铺垫知识。通常来说核心算法是皇冠上的明珠,但是仅有明珠是不够的还需要皇冠作为底座。

在将Join算法落地前,需要先了解一下数据库处理数据的基本架构。在理解架构的基础上,才能将Join算法放置到合适的位置。在前面系列文章中探讨了基于antlr实现SQL语句的解析。可以发现SQL语法支持的操作类型非常丰富:查询表(TableScan),过滤数据(Filter),排序(Order),限制(Limit),字段进行运算(Project), 聚合(Group),关联(Join)等。为了实现上述的能力,需要一个具备并行化能力且可扩展的架构。

1994年Goetz Graefe在论文《Volcano-An Extensible and Parallel Query Evaluation System》提出了一个架构设计思想,这就是大名鼎鼎的火山模型,也称为迭代模型。火山模型其实包含了文件系统和查询处理两个部分,这里我们重点关注查询处理的设计思想。架构图如下:

简单解读一下:

职责分离:将不同操作独立成一个的Operator,Operator采用open-next-close的迭代器模式。

例如对于SQL 。

对应到Scan, Select, Project三个Operator,数据交互通过next()函数实现。上述的理论在Presto中可以对应起来,例如Presto中几个常用的Operator, 基本上是见名知意:

动态组装:Operator基于SQL语句的解析实现动态组装,多个Operator形成一个管道(pipeline)。

例如:print和predicate两个operator形成一个管道:

在火山模型的基础上,Presto吸收了数据库领域的其他思想,对基础的火山模型进行了优化改造,主要体现在如下几点:

批量处理结合列式存储奠定了向量化计算的基础。这也是数据库领域的优化方向。

在研读Presto源码时,几乎到处都可以看到Page/Block的身影。所以理解Page/Block背后的思想是理解Presto实现机制的基础。有相关书籍和文档讲解Page/Block的概念,但是由于这些概念是跟其他概念混在一起呈现,导致一时间不容易理解。

笔者认为Type-Block-Page三者放在一起,更容易理解。我们使用数据库,通常需要定义表,字段名称,字段类型。在传统的DBMS中,通常是按行存储数据,通常结构如下:

但是通常OLAP场景不需要读取所有的字段,基于这样的场景,就衍生出来了列式存储。就是我们看到的如下结构:

即每个字段对应一个Block, 多个Block的切面才是一条记录,也就是所谓的行,在一些论文中称为tuple。通过对比可以清楚看出Presto中,Page就是典型了列式存储的实现。所以在Presto中,每个Type必然会关联到一种Block。例如:bigint类型就对应着LongArrayBlockBuilder,varchar类型对应着VariableWidthBlock。

理解了原理,操作Page/Block就变得非常简单了,简单的demo代码如下:

将数据封装成Page在各个Operator中流转,一方面避免了对象的序列化和反序列化成本,另一方面相比tuple的方式降低了函数调用的开销。这跟集装箱运货降低运输成本的思想是类似的。

理解了Join的核心算法和基础架构,结合前文中对antlr实现SQL表达式的解析以及实现where条件过滤,我们已经具备了实现Join的基础条件。接下来简单讲述一下Join算法的落地流程。首先在语法层面需要支持Join的语法,由于本文目的在于研究算法实现流程,而不在于实现完整的Join功能,因此我们暂且先考虑支持两张表单字段的等值Join语法。

首先在语法上需要支持Join, 基于antlr语法的定义关键点如下:

上述的语法定义将Join的关键要素拆解得非常清晰:Join的左表, Join的类型,Join关键词, Join的右表, Join的关联条件。例如,通常我们最简单的Join语句用例如下(借用presto的tpch数据源):

对应着语法和SQL语句用例,可以看到在将Join算法落地,还需要考虑如下细节点:

我们回顾一下SQL执行的关键流程:

基于上面的流程,问题其实已经有了答案。

以NestedLoop Join算法为例,了解一下Presto的实现思路。对于NestedLoopJoin Join算法的落地,在Presto中其实是拆解为两个阶段:组合阶段和过滤阶段。在实现JoinOperator时,只需负责两个表数据的笛卡尔积组合即可。核心代码如下:

本文简单梳理了Join的基本算法以及在Presto中实现的基本框架,并以NestedLoop Join算法为例,演示了在Presto中的实现核心点。可以看出相比原始的算法描述,Presto的工程落地是截然不同: 不仅支持了所有的Join语义,而且实现了分布式能力。这其中有架构层面的思考,也有性能层面的思考,非常值得探索跟研究。就Join算法,可以探索的点还有很多,比如多表Join的顺序选取,大表跟小表Join的算法优化,Semi Join的算法优化,Join算法数据倾斜的问题等等,可谓路漫漫其修远兮,将在后续系列文章中继续分析探索。

THE END
0.差异分析+火山图+COX模型构建生存分析之Cox模型简述与参数求解 edgeR需要的数据是reads数,可以设置BCV值,做单样本的差异分析。 edgeR包可以做无重复的差异分析,不过需要认为指定一个dispersion值(设置BCV值),这样得到的结果比较主观,不同的人就可以有不同的结果。通常如果是实验控制的好的人类数据,那么选择BCV=0.4,比较好的模式生物选择BCV=0.1 jvzquC41yy}/lrfpuj{/exr1r1?egl7c7475em
1.联手火山引擎,华硕利用大模型和向量数据库推出AI功能笔记本火山引擎所提供的字节大模型拥有优秀的语言感知能力,能够高效完成各类语言任务,通过自然语言交互在对话互动、信息获取和创作辅助等多种应用中展现出极高效能。目前,字节大模型已广泛应用于字节跳动内部50余条业务线,覆盖20个以上细分行业,尤其在文本分类、总结摘要、信息抽取、角色扮演、文案创作等多个方面表现出优势。 jvzquC41pg}t0|npc0ipo7hp1u~04976/2;.394fgvgjn6npcwzgv{72;682;7xjvor
2.火山翻译年度盘点:年底每天“干活”1.38亿次发现频道日前火山翻译团队发布《请翻译2020》年度盘点,详解过去一年上线的火山翻译Studio、火山同传等新品,以及在训练机器翻译模型过程中遭遇的技术难点和解决方案。2020年最后三天,火山翻译的调用量达日均1.38亿次,日均翻译的字符数超百亿规模。如果把火山翻译每天翻译的字符打印在A4纸上,堆起来的纸张相当于1.3个东方明珠的高度jvzq<84f0{uvvq3ep1tfy}jej1814:541v814:5432e24@568:6/j}r
3.火山方舟大模型服务平台火山引擎官方文档中心,产品文档、快速入门、用户指南等内容,你关心的都在这里,包含火山引擎主要产品的使用手册、API或SDK手册、常见问题等必备资料,我们会不断优化,为用户带来更好的使用体验jvzquC41yy}/xxqegpmjpn3eqo5eqlx1:498;
4.大模型的航海时代,火山引擎拼命造船股票频道在火山引擎位于海淀区大钟寺广场的办公楼见到谭待时,王慧文撤离大模型赛道的消息尚未传出,否则又会为这场专访提供一份堪称变量的背景。 话虽如此,大模型依然是全球资本追逐的宠儿,AI概念股推动纳斯达克在2023年实现了29%的涨幅,中国的下场者也高密度的出现在各家大厂和各所高校的顶尖名册里,但在大规模应用的构想里,所有人都还在等待jvzquC41uvudm7mgzwt/exr14284/9
5.火山方舟来了!字节首次公布大模型进展,要做淘金路上的卖水者自大模型被视为增长新动力(310328),在红海厮杀的云厂商无不争先恐后想要抓住这一机会,尤其后来者,更需要一个急转超车的时机。 但火山仍然迈出了谨慎的一步。6月28日,字节跳动旗下火山引擎发布大模型服务平台“火山方舟”,面向企业提供模型精调、评测、推理等服务。目前,“火山方舟”集成了智谱AI、MiniMax、百川智能jvzquC41vgii0qjzwp4dqv44249.2?24;181;:547:?/j}rn
6.火山引擎发布“火山方舟”,加速大模型应用落地  6月28日,在火山引擎主办、英伟达合作举办的“V-Tech体验创新科技峰会”上,火山引擎发布大模型服务平台“火山方舟”,面向企业提供模型精调、评测、推理等全方位的平台服务(MaaS,即Model-as-a-Service)。目前,“火山方舟”集成了百川智能、出门问问、复旦大学MOSS、IDEA研究院、澜舟科技、MiniMax、智谱AI(以拼音jvzq<84yyy4ykwmwcpku0lto1vkdj87245674A42g9=6e9h8g;g56jkcgeh34o5e;g<4;Ag1e0nuou
7.「分布式技术专题」三种常见的数据库查询引擎执行模型该计算模型将关系代数中每一种操作抽象为一个 Operator,将整个 SQL 构建成一个 Operator 树,查询树自顶向下的调用next()接口,数据则自底向上的被拉取处理。 火山模型的这种处理方式也称为拉取执行模型(Pull Based)。 大多数关系型数据库都是使用迭代模型的,如 SQLite、MongoDB、Impala、DB2、SQLServer、GreenplumjvzquC41dnuh0>6evq4dqv437363;<9148933?5
8.火山引擎发布“火山方舟”加速大模型应用落地6月28日,在火山引擎主办、英伟达合作举办的“V-Tech体验创新科技峰会”上,火山引擎发布大模型服务平台“火山方舟”,面向企业提供模型精调、评测、推理等全方位的平台服务(MaaS,即Model-as-a-Service)。目前,“火山方舟”集成了百川智能、出门问问、复旦大学MOSS、IDEA研究院、澜舟科技、MiniMax、智谱AI(以拼音首字母jvzq<84hkpgoen3eg0io1qtog1ps|z4fe1814<5814>0v;5452<3:h8:82>74?3ujvsm
9.字节参战!火山引擎明确不做大模型但已服务国内七成大模型厂商【TechWeb】“火山引擎自己是不做大模型的,我们首先服务好国内做大模型的厂商,等他们把大模型做好之后,我们再一起合作开展对外的服务。”火山引擎总裁谭待向TechWeb等表示。 随着ChatGPT的爆火,国内人工智能领域也风起云涌,互联网科技公司纷纷开启大模型军备竞赛。百度、阿里、360等大厂,以及MiniMax、智谱AI等创业公司jvzquC41pg}t0qjzwp4dqv44249.2=23;181:<9463>/j}rn
10.字节发布火山方舟:让大模型服务与应用像打车一样简单火山方舟平台的合作伙伴包括百川智能、出门问问、复旦大学 MOSS、IDEA 研究院、澜舟科技、MiniMax、智谱 AI等多家 AI 科技公司及科研院所。用户可以根据自己的需求,浏览和搜索不同类型和领域的模型,并查看模型的详细介绍和评价,也可以通过火山方舟平台,与服务商进行沟通和协商,定制专属于自己的模型服务方案。jvzquC41yy}/frfpmgpj0lto1pkxu8;5839/j}rn
11.让大模型信得过、用得起,火山方舟开辟了新玩法作为近年来发展速度最快的互联网厂商之一,字节旗下火山引擎虽然看似低调,不过凭借抖音等业务IT资源和基础架构的规模优势,已悄然将业务拓展至外部客户。在大模型领域,与大多数互联网厂商不同,火山引擎采取了“淘金卖水”的商业策略,类似于京东、天猫模式,不仅汇集了一批来自AI创新公司和科研院所的优秀模型,还提供充沛算jvzquC41o0gdh~s0ep5w1Hfe?6786?722(zzrnBctvodnn
12.火山“所想即所⻅,七⽕⼭⽂⽣视频Etna模型发布”,超讯摘要: 超讯通信 X七火山“所想即所⻅,七⽕⼭⽂⽣视频Etna模型发布”,超讯公布未来三年计划,国产Sora 发布会秒杀众多模型,行业大佬齐聚一堂,共议AI发展蓝图。看点: 1. 七火山文生视频模型Etna可稳定生成8-15秒的视频,背后是积累与沉淀。 2. 超讯通信 未来jvzquC41zwkrk~3eqo5659662;=2:87:2;625?7
13.集贤科技:联合博通集成及火山引擎大模型能力打造具备自然交互与集贤科技:联合博通集成及火山引擎大模型能力 打造具备自然交互与教育功能的下一代AI玩具Video Player is loading.00:00/00:00 Loaded: 0% 视频加载失败,请查看其他精彩视频 相关视频 猜你喜欢 00:03:34 法国人脸都绿了!毛子那个外交女发 00:01:05 广交会韩端科技展示开源鸿蒙版人形 00:01:08 中方jvzquC41xkjfq7xkpc4dqv3ep1v0hrscpek04977/29.3A4fgvgjn6npgr€uhy=;27;6:7i0jvsm
14.豆包图像编辑模型3.0上线火山方舟豆包图像编辑模型3.0上线火山方舟发现更多热门视频 天才就是天才 亚马尔中路油炸丸子强突+接费尔明脚后跟妙传抢射破门 不会杀球的张某人2万次播放 张颂文谈辛芷蕾演技变化,赞其演绎人物挣扎如动物嘶吼 电影拆台君3561次播放 太子破僵!福登禁区弧顶贴地斩破门,随后与场边球迷自拍庆祝 不会杀球的张某人9058次播放 勒布jvzquC41xkjfq7xkpc4dp8kkpctdg872473196821fkucrq/kpljht{g92619<80f0nuou