Apache Doris 创始人:何为“现代化”的数据仓库?

news2025/1/2 22:59:47

在 12 月 14 日的 Doris Summit Asia 2024 上,Apache Doris 创始人 & PMC 成员马如悦在开场演讲中,围绕“现代化数据仓库”这一主题,指出 3.0 版本是 Apache Doris 研发路程中的重要里程碑,他将这一进展总结为“实时之路”、“统一之路”和“弹性之路”,详细介绍了所对应的核心特性的设计思考与应用价值,揭晓了 2025 年社区发展蓝图。

本文节选自马如悦在 Doris Summit Asia 2024 上的演讲,以马如悦第一人称叙述,经编辑。

最具影响力开源大数据项目之一

Apache Doris 自 2013 年创建至今已 10 年有余,截至目前,GitHub Stars 已近 13,000,社区的贡献者达到近 670 名,平均每月活跃贡献者超过 120 名。这一成就使其超越了 Spark、Kafka 等项目,成为开源大数据和数据库领域中月活开发者最多的项目。此外,Apache Doris 在所有 Apache 项目中官网浏览量稳居第一,2024 年 4 月网站 PV 高达 900w,可见其受欢迎程度。

最具影响力开源大数据项目之一.PNG

全球中大型企业规模突破 5000 家

在 Apache Doris 技术持续创新与稳步发展下,越来越多的用户及企业选择并使用 Apahce Doris。我记忆犹新的是,2022 年时,Apache Doris 所覆盖企业规模不足千家,然而时隔仅 2-3 年,目前正在使用 Apache Doris 的中大型企业已突破 5000 家,并且不断有新的用户了解并尝试使用 Doris。这一迅猛增长得益于社区所有用户及开发者的反馈、建议及开发共建,同时也离不开其商业公司飞轮科技提供的技术驱动、用户维系和社区建设等全方位的支持。

这 5000 家企业覆盖范围十分广泛且多元化,包括金融、互联网、电信、游戏、交通物流、零售快消、能源制造等多个领域,并且正在不断拓展新的应用场景,这充分证明了 Apache Doris 的强大性能及广泛适用性。今天到场的许多嘉宾正是我们的用户,在接下来的议程中,他们也将带来精彩的主题演讲,期待能给更多人带来启发与洞见。

全球中大型企业规模突破 5000 家.PNG

2024 年,Apache Doris 重点推出了 3.0 版本,这一版本是研发之路上的重要里程碑。其缘由在于,自诞生之初,Apache Doris 就定位于现代化实时数据仓库。在 3.0 版本之前,尽管它在很多特性上都非常领先、大受欢迎,但并未完全实现现代化特性。然而,"现代化"这一理念在 3.0 版本中得以全面实现,并得到了充分的验证。接下来,我将从实时、统一和弹性三个方面,介绍 Apache Doris 在现代化数据仓库创新之路上的进展。

Real-Time,实时之路

随着工业 3.0 发展阶段的到来,数字技术已成为主流,企业正全面迈入实时分析时代。从以往批量报表转变为如今的实时仪表盘,从面向内部的分析扩展为面向外部的分析服务,从静态报表到交互式即时查询,从以人为中心到自动算法调用…这些变化都对实时性提出了非常高的要求。

Real-Time,实时之路.PNG

实时分析是 Apache Doris 最为基础且核心的特性之一。项目建立之初,大多数用户正是被 Doris 的实时性所吸引。如今,Apache Doris 的实时性无疑已成为业界的标杆。那么,Apache Doris 是如何实现如此强大的实时分析性能呢?

01 秒级实时数据写入

实时数据的核心在于确保数据的新鲜度和快速可见性。为实现这一目标,Apache Doris 在实时数据的导入与存储方面进行了大量优化,具体分为以下三部分:

  • 秒级实时数据写入: 支持秒级的实时数据写入,能够通过高效的 StreamLoad 和 Insert Into 功能实现快速数据导入。此外,它还支持服务端的批量 Group Commit,提升数据高频实时写入的效率。同时,Doris 可自动从 Kafka 拉取数据,并支持数据库的 CDC、Flink 和 Spark 的实时数据导入,并均可实现秒级入库。
  • 高性能数据更新: 引入基于 Merge-on-Write 的主键模型,该表模型在数据写入时即对需要删除或更新的数据进行标记,始终保证有效的主键只出现一个文件中。同时,Doris 也支持 UPSERT 操作,包括条件更新、条件删除和部分列更新,以及基于 Sequence 列的并发导入事务。这对于高频写入的场景来说,大大减少了查询执行时的额外消耗。
  • 轻量级元数据变更: 支持轻量级的元数据变更操作,如更改列名、增加或删除值列,以及调整 Varchar 列的长度等。这些操作可在毫秒级别内完成,确保数据能够实时更新,满足实时性需求。

02 极速交互式分析性能

相较于事务型数据库,分析数据库则更注重交互式分析体验。为提供更好的交互性分析,Apache Doris 在性能上不断优化,包括对向量化引擎、基于 CBO 的优化器、丰富的索引支持、单表/多表物化视图以及在 ARM 架构下的深度优化等。在这些能力的加持下,Apache Doris 在测试集中表现优异:

  • 在 ClickBench 测试中,Apache Doris 分别在 2022、2024 年 10 月,在榜单上领先所有工业界数据库 。
  • 在 TPC-H 测试中,Apache Doris 在 Join 场景中表现优异,其性能约为 Greenplum 的 3 至 8 倍。
  • 在 TPC-DS 测试中,结果显示 Apache Doris 性能较 Trino/Presto 提升了约 3 倍。

02 极速交互式分析性能.png

03 超大规模用户高并发查询

在数据量不断激增的当下,高并发查询的需求也愈发的明显。Apache Doris 在高并发查询方面进行多项优化,最终实现了单节点最高上万 QPS 的并发:

  • 分区分桶裁减:采用 Partition、 Bucket 两级分区,通过 Hash 将数据打散至各个节点中,以此提升读取并行度和吞吐量。
  • 主键索引 & 倒排索引: 提供丰富的索引结构来加速数据的读取和过滤。通过索引显著减少了需要扫描的行数,降低 CPU 和 IO 的压力,大幅提升了系统整体并发能力。
  • 行列混存:引入行式存储格式,在数据服务场景中行存更为高效,可减少磁盘访问次数。用户可指定开启行存,点查时每行只需一次 IO,在宽表列较多的情况下性能有数量级提升。
  • 点查短路径及预处理语句优化:实现了点查短路径优化,绕过查询优化器以及 PlanFragment 来简化 SQL 执行流程,直接使用快速高效的读路径来检索所需的数据。同时,FE 端支持与 MySQL 协议兼容的预处理语句,在 CPU 成为瓶颈时,Prepared Statement 可实现 4 倍以上的性能提升。

04 高可用架构设计

分析型数据仓库如今不仅为企业内部提供 BI 报表和分析,还广泛服务于外部客户及大量高并发用户。因此实时系统需要秒级数据入库和查询,且不允许停机维护。对于此,Apache Doris 的优势也十分明显:

  • 简洁架构设计:采用简洁的架构设计,确保元数据节点(FE)和存储计算节点(BE)均无单点故障,确保在硬件故障时,服务能够持续运行而不受影响。
  • 在线扩容与滚动升级:支持在线扩容和滚动升级,用户能够在不中断服务的情况下,灵活地调整计算资源和存储容量,极大地提升了系统的弹性,允许用户根据实际需求快速扩展。
  • 数据自动均衡:系统提供数据自动均衡功能,确保数据在各节点间均匀分布,从而提升查询性能和资源利用率。
  • 在线模式变更:用户可以在不停机的情况下动态增删索引,快速响应业务变化,灵活地调整数据结构以满足不同场景的需求。
  • 存算分离支持:在 3.0 版本中引入了存算分离,可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,计算和存储资源可以独立扩展,进一步提升了系统的灵活性和性能。

Unified,统一之路

在大数据分析领域,企业面临着多样化的分析需求,往往需要部署多个工具或技术来应对不同场景。这种做法往往导致组件繁多、运维成本高昂、数据链路冗长以及数据重复存储等诸多问题。

数据仓库几经发展,逐步从传统数据仓库演变为大数据平台/数据湖,如今又迎来了现代化数据仓库,对应的架构也在发生着变化。底层数据源类型从传统的结构化数据扩展为多种半结构化数据;中间层从 ETL、数据仓库、数据湖相互独立演变为相互融合;顶层则引入了数据科学、机器学习和人工智能应用。这些演变都对数据处理的时效性、灵活性与效率提出更高的要求。

Unified,统一之路.png

在这样的背景下,Doris 作为现代化统一数据仓库,能够有效应对多样的分析场景。其 All-In-One 的设计理念不仅简化了数据的使用和管理,还使企业将精力从复杂的数据基础设施管理转向上层的数据应用。

01 湖仓无界

“湖仓无界”,即 Lakehouse,是数据领域的全新概念。Apache Doris 作为一款现代化的数据仓库,凭借其独特的架构,完美诠释了这一理念。而 Apache Doris 之所以能被称为 Lakehouse,主要得益于其两大特性:

01 湖仓无界.png

  • 联邦查询能力:Apache Doris 通过扩展 Catalog 和存储插件,使用户无需将数据物理集中至统一的存储空间,在保持各数据源独立性的同时,仅借助 Apache Doris 即可实现多个异构数据源的统一分析,既可以直查外部表以及存储文件、也可以执行内表和外表以及外表相互之间的关联分析。此外。目前 Apache Doris 已经支持了 10 余种主流湖、仓、关系型数据库的连接器。
  • 开放的数据湖特性:Apache Doris 引入高吞吐读写 API,也称之为 Data API 或 Storage API。打破了数据封闭性,使外部引擎能直接、高效地访问和存储 Doris 中的数据,无需受限于造成性能瓶颈的 JDBC/ODBC 协议。

凭借这些特性,Apache Doris 既能作为强大的 SQL 查询引擎,也能作为开放、灵活的数据湖,实质上满足了 Lakehouse 的定义。

那么,Apache Doris 与其他纯粹的 Lakehouse 相比较,其优势在哪里? 其核心在于“避免过早复杂性”,这里我通过一个例子来说明。

对于许多业务团队而言,其业务数据量可能仅有几百 GB,甚至更少,且尚未引入如 HDFS 这类复杂的数据架构。对于这种情况,Apache Doris 只需简单的几个节点即可迅速投入使用,部署过程极为简便。随着系统和业务需求的逐步复杂化,比如需要集成机器学习引擎或查询 HDFS 上数据时,凭借 Apache Doris 灵活的架构设计及弹性,能够实现逐步的升级与演进,无需在最开始就搭建复杂的系统。

许多用户在使用某些 Lakehouse 产品时感到不便,其根源在于这些产品要求用户在数据量有限的情况下就搭建复杂的 HDFS 及多个组件,这无疑增加了不必要的复杂性,也即“过早复杂性”。相比之下,Apache Doris 则秉持着从简单到复杂的逐步演进原则,有效避免了这一问题。

02 半结构化数据分析

2024 年,我们注意到一个显著的趋势,将近一半的 Elasticsearch 使用者倾向于采用 Apache Doris 来替代 Elasticsearch。尽管 Elasticsearch 在半结构化数据分析领域占有一席之地,但随着 Apache Doris 的持续突破,正逐步成为未来半结构化数据分析的核心引擎。这一转变主要归功于三大关键点:

  • 复合数据类型:支持 Array、Map、Struct、JSON 复合数据类型,常用于用户行为和画像分析、点查、查询数据湖中 Parquet ORC 等格式数据的场景。
  • Variant 数据类型:支持 Variant 数据类型,支持存储半结构化数据以及包含不同数据类型(如整数、字符串、布尔值等)的复杂数据结构,无需提前在表结构中定义具体的列。擅长处理复杂多变的嵌套结构,可自动推断列信息并合并到现有 Schema,支持动态子列的存储。同时,表中可以同时包含灵活的 Variant 列和静态列,提供更大的存储和查询灵活性。相较于 JSON 类型,存储空间减少了约 65%,查询速度提升超 10 倍。
  • String 数据类型:优化了正则匹配和子串匹配算法,引入了 NGram BloomFilter,提升了使用 LIKE 语句时的查询速度;同时,通过倒排索引,对文本进行细粒度分词,使得用户可以使用 MATCH 等相关语句,实现文本快速检索。

Elastic,弹性之路

弹性的重要性在于它能够提升数据库的灵活性、可扩展性以及资源利用率,同时可降低企业的运维成本和潜在风险。为此,Apache Doris 在提升弹性方面也不断努力。

01 存算一体

在存算一体时代,Apache Doris 便提供了弹性资源管理功能,先是推出了基于资源标签(Resource Tag)的物理隔离方案,后在 2.1 版本中推出了 Workload Group 管理方案,能够基于 CGroup 技术在每台机器上实现 CPU 资源的硬限和软限。在存储方面也很早便实现了冷热分层策略,热数据存储在成本更高的 SSD 盘上,而冷数据则存储在相对低成本的 HDD 盘甚至更为廉价的对象存储上,保存方式也从多副本变为单副本,冷数据无需占用宝贵的本地机器资源,从而避免了因扩充容量而购买更多机器的需求。

02 存算分离全新架构

而在 3.0 版本中,Apache Doris 开始支持存算分离模式,基于云原生存算分离的架构,用户可以通过多计算集群实现查询负载间的物理隔离以及读写负载隔离,并借助对象存储或 HDFS 等低成本的共享存储系统来大幅降低存储成本。在存算分离架构中,元数据存储在 FoundationDB,数据则存储在 S3 等对象存储中。在这一架构下,FE 和 BE 节点均变得无状态,所有数据都存放于共享的对象存储,而非本地存储。同时,为了提升性能,Doris 引入了高速缓存机制。

Elastic,弹性之路.png

针对存算分离是否会影响性能的问题,我们进行了存算一体模式和存算分离模式在不同缓存下的 TPC-DS 1TB 性能测试。结果显示,在缓存命中的情况下,性能基本无损;部分命中缓存时,性能损耗约为 10%;而在缓存不命中的情况下,性能损失约为 30%。但相较于业内其他同类系统,存算分离模式下的 Apache Doris 仍有着极为明显的性能优势。

Elastic,弹性之路-2.png

03 两种部署形态融合

弹性的资源管理始终是数据分析基础设施的永恒追求。我们提供存算一体和存算分离两种部署形态,以便发挥各自的优势:存算一体部署简便且性能优越,而存算分离则支持灵活的独立扩缩容。

进一步来看,存算分离的部署需要依赖高性能的对象存储或文件系统,以及充足的网络带宽。如果企业的存储基础设施或网络带宽受限,存算分离的性能可能受到影响。这也解释了为何存算分离常与云原生技术相关联,虽然存算分离并非云原生特有,但云原生环境为其提供了高带宽和优质对象存储,为其提供了理想的设施基础。

当前,一些用户认为在开始时就要选择存算一体或存算分离的部署形态并不合理,尤其是在数据量较小时。因此,Apache Doris 未来计划融合这两种部署形态,用户无需再纠结于选择哪种部署形态,无论是从存算一体切换到存算分离,还是反向切换,都可以通过简单的参数配置实现自动切换,而无需重建集群或重新导入数据。

03 两种部署形态融合.png

2025,探索更多可能性

展望 2025,在功能需求上,Apache Doris 将更加专注于用户需求,聚焦四大板块,强化其技术实力:

  • 内置 CDC 同步:Apache Doris 虽已支持丰富的数据导入方式,但 CDC 仍依赖外部工具或生态合作伙伴。未来将实现内置 CDC 同步功能,目前我们已研发出初步版本,支持从众多 TP 数据库直接 CDC 导入数据。
  • 支持增量数据处理:投入大量人力支持基于增量式的批量处理。这种方式不同于 Spark 或传统 Hive 的批量模式,具备更高的时效性,能够显著提升数据处理效率。
  • 完善湖仓一体:兼容 Trino/Presto Connector 框架,这意味着 Apache Doris 将能够直接使用 Trino 和 Presto 所支持的功能,无需重复开发。同时,还将完善高吞吐读写的 Data API,以提升整体性能。
  • 存算一体和存算分离部署形态融合:Apache Doris 未来计划融合这两种部署形态,用户无需再纠结于选择哪种部署形态,无论是从存算一体切换到存算分离,还是反向切换,都可以通过简单的参数配置实现自动切换,而无需重建集群或重新导入数据,避免架构过早复杂性。

在非功能需求上,Apache Doris 将全力投入于三个方向持续发力:

  • 更优:提升导入性能,将查询性能从秒级提升为亚秒级,为保持全球查询性能第一的位置而持续发力。
  • 更稳:实行更加严格的版本迭代策略,三位版本将不再引入新 Feature,专注于 Bug 的修复,并加强更多测试覆盖。实现内核插件化,基于插件化引入新功能与周边功能。
  • 更易用:对于配置较为复杂的参数,未来将努力简化参数配置,并提升产品文档质量,完善周边生态工具,以增强用户使用体验。

Doris Summit Asia 2024 峰会回放 & PPT 资料现已公开,前往 Summit 官网 点击查阅或下载

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

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

相关文章

3. 指针、数组

目录 一、指针和数组 🍐 数组名指向首地址 🍊 例子 二、数组作为函数参数 🍋 数组名作为函数参数,为什么必须传递数组大小? 三、指针和字符数组 🍌怎么样存储一个string? &#x1f349…

upload-labs关卡记录14

让上传图片马,并且三种后缀都要上传成功才算成功: 先试试gif的吧: 可以上传,同理:查看源码 只检查了两个字节,我们直接修改一句话木马,先改后缀php为png,然后winhex修改头部就完了 …

前端(htmlcss)

前端页面 Web页面 PC端程序页面 移动端APP页面 ... HTML页面 HTML超文本标记页面 超文本:文本,声音,图片,视频,表格,链接 标记:由许多标签组成 HTML页面运行到浏览器上面 vscode便捷插件使用 vs…

HTML——16.相对路径

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><a href"../../fj1/fj2/c.html" target"_blank">链接到c</a><!--相对路径&#xff1a;-->…

coturn docker 项目 搭建【一切正常】

业务需求&#xff1a;需要coturn这个服务 定制语音视频连线 请参考"小红的逃脱外星人追踪计划" coturn项目 本地测试连接服务 turnutils_stunclient -p 3478 127.0.0.1turnutils_stunclient -p 3478 -L 127.0.0.1 127.0.0.1telnet localhost 3478turnutils_uclient …

【回溯】LeetCode经典题目总结:组合、排列、子集、分割、N皇后、单词搜索

回溯 组合问题组合总和全排列子集分割回文串N皇后电话号码的字母组合单词搜索括号生成 组合问题 给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 树形结构&#xff1…

Linux-frp_0.61.1内网穿透的配置和使用

下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar&#xff1a;一个用于压缩和解压缩的工具。-z&#xff1a;表示使用 gzi…

WEB攻防-通用漏洞-文件上传-js验证-MIME验证-user.ini-语言特征

目录 定义 1.前端验证 2.MIME验证 3.htaccess文件和.user. ini 4.对内容进行了过滤&#xff0c;做了内容检测 5.[ ]符号过滤 6.内容检测php [] {} ; 7.()也被过滤了 8.反引号也被过滤 9.文件头检测 定义 文件上传漏洞是指攻击者上传了一个可执行文件&#xff08;如木马…

Excel基础知识

一&#xff1a;数组 一行或者一列数据称为一维数组&#xff0c;多行多列称为二维数组&#xff0c;数组支持算术运算&#xff08;如加减乘除等&#xff09;。 行&#xff1a;{1,2,3,4} 数组中的每个值用逗号分隔列&#xff1a;{1;2;3;4} 数组中的每个值用分号分隔行列&#xf…

快速下载pytorch_geometric

注意&#xff1a;千万不要一上去就使用pip去安装&#xff01;&#xff01;&#xff01; 1.找到GitHub手动下载所需依赖: https://github.com/pyg-team/pytorch_geometric 进入网址后点击此处&#xff1a; 2.点击here进去后寻找自己的torch版本&#xff08;我的是torch2.1.2的…

数学建模 绘图 图表 可视化(2)

文章目录 前言柱形图条形图克利夫兰点图系列坡度图南丁格尔玫瑰图径向柱图极坐标图词云图总结参考资料 前言 承接上期 数学建模 绘图 图表 可视化&#xff08;1&#xff09;的总体描述&#xff0c;这期我们继续跟随《Python 数据可视化之美 专业图表绘制指南》步伐来学习其中l…

建造者模式 Builder Pattern

在创建一个对象的时候&#xff0c;构造器参数有点多&#xff0c;而且有些参数还是可选的&#xff0c;再者还有不少同类型的&#xff0c;那就更应该使用 builder 模式了。 使用 Builder 模式的初衷是 把易变性&#xff08;mutability&#xff09;移动到Builder类&#xff0c;而…

【Java】IO流练习

IO流练习 题干&#xff1a; 根据指定要求&#xff0c;完成电话记录、 注册、登录 注册 题干&#xff1a; 完成【注册】功能&#xff1a; 要求&#xff1a; 用户输入用户名、密码存入users.txt文件中 若users.txt文件不存在&#xff0c;创建该文件若users.txt文件存在 输入…

计算机网络:应用层 —— 网络应用模式

文章目录 客户—服务器方式和对等方式客户/服务器方式 (C/S方式)工作流程特点 对等方式 (P2P方式)工作流程P2P 应用特点 客户—服务器方式和对等方式 网络应用程序运行在处于网络边缘的不同的端系统上&#xff0c;通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用…

118.【C语言】数据结构之排序(堆排序和冒泡排序)

目录 1.堆排序 2.冒泡排序 单趟排序的两种情况 情况1.和arr[i]的前一个元素交换,第一次循环结束时i的值为n-1,第二次循环结束时i的值为n-2 情况2.和arr[i]的后一个元素交换,第一次循环结束时i的值为n-2,第二次第一次循环结束时i的值为n-3,... 将单趟排序代码嵌入外循环中…

【图像处理lec9】小波与多分辨率分析

目录 一、背景 1、引出小波变换 2、图像金字塔 &#xff08;1&#xff09;图像金字塔的基本概念 &#xff08;2&#xff09;高斯金字塔 &#xff08;3&#xff09;拉普拉斯金字塔 &#xff08;4&#xff09;金字塔的结构与生成框图 3、子带编码 &#xff08;1&#xf…

ubuntu2204 gpu 没接显示器,如何连接vnc

之前一直用ssh ,一直没接显示器&#xff0c;后来实在不方便&#xff0c;要安个vnc看一下&#xff0c;结果装上就黑了 硬件上&#xff1a;买一个HDMI显卡欺骗器插在设备上。 软件上&#xff1a;装一个虚拟显示器欺骗一下 sudo apt install xserver-xorg-coresudo apt install…

黑神话悟空游戏鼠标光标使用教程与下载

效果图&#xff1a; 鼠标光标特点 这套鼠标光标的设计灵感来源于《黑神话&#xff1a;悟空》游戏中的角色和元素&#xff0c;具有以下特点&#xff1a; • 主题鲜明&#xff1a;光标设计紧扣游戏主题&#xff0c;采用了游戏中的元素&#xff0c;让玩家在使用电脑时也能感受到…

32132132123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

简述css中z-index的作用?如何用定位使用?

z-index是一个css属性&#xff0c;用于控制元素的堆叠顺序&#xff0c; 如何使用定位用index 1、position&#xff1a;relative&#xff1b; z-index&#xff1b; 相对于自己来定位的&#xff0c;可以根据top&#xff0c;bottom&#xff0c;right&#xff0c;left&#xff…