Apache DolphinScheduler 助力 Trino 快速实现湖仓一体数据建设

 点亮 ⭐️ Star · 照亮开源之路

https://github.com/apache/dolphinscheduler

f951d42bf6328a99b75665a884c02166.png

作者 | 钟嘉杰 Apache DolphinScheduler 

PMC

 Member

  //  

在面对联合查询和湖仓一体场景时,Trino 已经是不少开发者的不二之选。Trino 是一个查询引擎,在数仓、即席查询方面非常强大。然而,在整个数仓处理场景中,相信很多数仓用户关注的不仅是查询,还有应用层面的可视化编辑 SQL 能力、失败重试、任务并发控制、SQL 版本管理、任务编排等能力,但这些 Trino 还未提供。幸运地是,Apache DolphinScheduler 作为一个工作流调度平台,最擅长的就是提供这样的能力。如果两者相结合,就可以互相取长补短,补足彼此的能力。

本文中,我们将通过实例,分析 Apache DolphinScheduler 如何与 Trino 结合,满足用户实现 OLAP 业务的需求,同时引入尽可能少的组件,快速实现湖仓一体数据建设。

01

什么是 Trino

Trino是一种开源分布式SQL查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集。(Trino is a query engine that runs at ludicrous speed, Fast distributedSQLquery engine for big data analytics that helps you explore your data universe.) 虽然 Trino 可以理解 SQL,但是其使用场景并不是我们常见的Online Transaction Processing (OLTP),大家更多地将它用于在湖仓一体中处理 Terabytes or Petabytes 级别的数据。因为它同时支持湖仓一体, 数据分析和 Ad-hoc 场景,很多公司将其作为从处理源数据,构建湖仓一体开始,到终端用户的 ad-hoc 结束的全链路工具。

Trino 具有强大的数据处理能力,允许多台机器同时协作,与 DolphinScheduler 一样,Trino 支持高可用和 connectors 插件化,能保障终端服务的可用性,有较高的水平扩展性。

348c5db0e46444b6dace68f74a638b3b.png

02

什么是 DolphinScheduler

Apache DolphinScheduler 作为 Apache 基金会的一个 Top Level Project,是一个分布式和可扩展的开源工作流协调平台,具有强大的DAG可视化界面。其最主要的特点是:平台化, 拖拉拽, HA, 高性能, 以及插件化设计。

  • 平台化:自动处理非业务的逻辑, 如失败重试,并发控制,检控,复杂任务依赖等,让用户更加容易使用

  • 拖拉拽:通过 UI 创建 workflow 首要地位, 同时支持 API 创建, 让 engineer 和 not-engineer 都能很好的使用

  • HA:Decentralization,原生 HA 队列,保障集群可用性

  • 插件化设计:简单方便地扩展插件,更方便地和用户系统集成,同时有很多内部插件

6652deca81e93dff54c3bb113a37fe57.png

03

用户场景

我们将通过一个实际的例子,简述如何通过 Trino 和 DolphinScheduler 的结合,满足用户实现 OLAP 业务的需求,同时引入尽可能少的组件。

公司发展初期 – OLTP阶段

Trino 作为一个适用于湖仓一体和 ad-hoc 的查询引擎,非常适用于快速发展的公司,可以只维护同一套 infra 让数据业务运行起来。其常见的使用场景是用户的业务系统有数个 RDBMS ,里面存储了用户常见的业务数据,包括用户基本信息、订单信息、商品信息等,另一个 RDBMS 储存了商家信息,商品销售情况等。另外,企业还需要从外部获取部分数据,如行政区划分,各个区的GDP,各个地区最新政策,以及区域人口信息等。

公司成立初期,用户专注于业务系统开发,这个时候大部分的操作还是基于 RDBMS 的 OLTP 操作,即对 RDBMS 进行 CURD,完成特定的业务动作。

公司发展中期 – OLAP阶段

但是随着业务的发展,用户希望通过 BI 工具展现数据,用数据指导业务活动,促进用户成单,增加销售额,以及通过对销售期间商品数据的分析,得出各个活动的 ROI (Return On Investment) 。这时候用户需要一个基于分析的系统,原来的 RDBMS 数据库的方式已经不足以支撑类似的需求了。

用户此时想要有一个基础组件,能同时满足定时的 BI 报表,又能让分析师,产品可以做快速查询的工具。这样,他们只需要维护同一套 infra 设施就能让业务跑起来。Trino 就是这样一个工具,其高性能、高稳定性、多 connector 的特性,能同时满足用户批量离线数据的需求,保证 ad-hoc 查询的实效性。

0ce74df34706da45fcdca60937fcf608.png

此时,用户的 OLAP 系统数据流向是这样的,Trino 会读源数据库 RDBMS 和外部系统的数据,在 Trino 中做构建湖仓一体,同时让数据支持两个系统,BI visualization(对于部分常规固定报表的统计) 和 Analysis APP(探索性、实验性查询)。

SELECT count(*), mktsegment, nationkey,
       CAST(sum(acctbal) AS bigint) AS totalbal
FROM customer
GROUP BY mktsegment, nationkey
HAVING sum(acctbal) > 5700000
ORDER BY totalbal DESC;

面临的问题

用户在构建湖仓一体时,会遇到各种问题。下面我们将围绕这些问题的阐述,以及 Apache DolphinScheduler 是如何解决这些问题而展开。

许多零散SQL管理问题

在这个分析系统创建期间,面临最大的问题是湖仓一体的构建。为了更好地节省数据计算的时间,降低SQL的复杂度,人们一般会将湖仓一体构建成拥有多个 Layer 的系统,并产生多个中间表。将上图的 Trino 进行拆解,就会发现它由很多SQL组成,并且SQL之间有不同的联系。如果将每个SQL任务作为一个节点,SQL任务间先后执行的关系作为一条线,那SQL任务本身及其关系就构成了一个有向无环图(DAG)。在湖仓一体初期,用户可通过 Crontab 任务按照一定的时间执行不同的 SQL,或者通过 Python 等将SQL任务链接起来。

但是数据的价值巨大,当有了湖仓一体并从分析中得到了正向的结果后,就需要探索更多的数据,这意味着更多的分层,分层增多会给原来的 Crontab 或者 Python 任务带来压力,有时候找到合适的位置将SQL任务放入 DAG 甚至比编写SQL任务的所花的时间还要多。

5cfa55a7d1fa6857d55c459e09a64260.png

可能会有多条 SQL

INSERT INTO customer_total_bal
SELECT count(*), mktsegment, nationkey,
       CAST(sum(acctbal) AS bigint) AS totalbal
FROM customer
GROUP BY mktsegment, nationkey
HAVING sum(acctbal) > 5700000
ORDER BY totalbal DESC;
INSERT INTO package_addr_weight
SELECT origin_state, destination_state, origin_zip, sum(package_weight)
FROM shipping
GROUP BY DISTINCT
    CUBE (origin_state, destination_state),
    ROLLUP (origin_state, origin_zip);
INSERT INTO clerk_price_rnk
SELECT orderkey, clerk, totalprice,
      rank() OVER w AS rnk
FROM orders
WINDOW w AS (PARTITION BY clerk ORDER BY totalprice DESC)
ORDER BY count() OVER w, clerk, rnk

Apache DolphinScheduler 提供了简单高效的 web UI, 用户可以用 DolphinScheduler 管理SQL脚本,管理方式包括直接在SQL任务定义管理,或者资源中心管理。

SQL任务定义管理

在 DolphinScheduler 的 datasource 中创建 Trino 的数据源

cb93d315b9c2d7819641b6a04281aa7b.png

b1a013ea8e30321aadd4eb66893f71be.png

回到 Project 页面创建一个SQL任务,并将上述的SQL脚本粘贴到SQL任务定义中,即可通过 DolphinScheduler 管理SQL脚本。DolphinScheduler 还能为每个任务提供SQL脚本的版本管理,方便用户做版本回退。

e67fe28b762e82ebed10708050b33612.png

2dda2bb59a12490926129f4494d63c61.png

资源中心管理SQL文件

如果你倾向于使用外部储存,如 Amazon S3,MinIO 或者 HDFS 来保存你SQL脚本,然后通过 Command line interface 的方式触发,你可以利用 DolphinScheduler 的资源中心,以及 Shell 任务类型完成这一切。使用资源中心之前,你需要先配置并启动 DolphinScheduler,可以参考这里完成配置。启动资源中心后,可以将本地的脚本通过 DolphinScheduler 资源中心上传到对应远端存储介质。

71c170a984a745a5e31b9d9cee2dddee.png

404df11fb189bfe00b5b09e8a1587845.png

在通过 DolphinScheduler 资源中心管理后,我们可以在 DolphinScheduler 中创建一个 Shell 任务,在任务中引用对应的SQL脚本,并通过 Trino Command line interface 的方式执行对应的SQL。需要注意的是,当你选择使用这个方式提交任务的时候,DolphinScheduler 每个 worker 节点都需要安装 Trino Command line interface 并将其加到 $PATH 中。

303424b7a2a4ee67e8534ff86fa67fb1.png

SQL依赖问题

除了SQL脚本的管理问题外,各个SQL任务之间的依赖也是将要解决的问题。湖仓一体的多层结构,意味着有部分SQL需要先运行, 有部分SQL需要后运行, 那么任务执行的顺序,以及各个任务之间的依赖就显得非常重要。

DolphinScheduler 作为一个任务调度系统,天然地能够解决复杂任务依赖的问题。DolphinScheduler 编排工作流的方式遵循 Drag and Drop First 的原则,你可以通过在 web UI 页面进行 Drag and Drop 的方式建立、删除任务之间的关系,你需要做的就是通过鼠标,将前后两个任务链接起来。

ec62c62abdf4b5464e4ce893037adc39.png

6e4d125b68aef711be7dbf0ef53857f9.gif

DolphinScheduler 的版本管理,不仅能管理工作流中各个任务的定义, 还能管理任务依赖,意味着我们在做版本 revert 的时候,能将拿到对应版本整个工作流的信息。

湖仓一体构建过程中, 处理上述同一工作流中直接的任务依赖外,还会有特殊的依赖,DolphinScheduler 均提供了 out-of-box 的解决方式,如:

  • 当当前工作流的特定任务成功时,想要触发下游工作流运行,可以使用 DolphinScheduler 中的任务程序

  • 不仅想要基于当前工作流上游任务触发任务,还希望触发其他工作流中的任务,选择任务依赖设置不同工作流中的上游任务

  • 还想在上游任务失败而不是成功时触发一些下游任务,可以根据上游任务状态根据上游任务状态尝试不同的下游任务条件和路线。

b1df5c3df515240ccfe8d2aa5e53a79c.png

Connector 系统压力大导致查询慢或者失败

使用 Trino 过程中,用户和 connector 打交道应该是最多的。Trino 有一个优势, 允许一个SQL脚本对来自不同 connector 的数据进行操作。这大大降低了用户使用成本,用户不再需要将数据从一个地迁移到另一个地方,然后再做关联查询。但是直接对原数据库做查询也可能会面临一些问题,比如源数据库是业务数据库,当业务高峰期的时候,数据库读的速度会变慢,如果SQL正好对这个数据库进行操作,就会面临查询变慢,甚至失败的问题。

如何保证 Connector 查询慢甚至失败的时候,SQL任务仍然能正常产出,或者及时发送 Alert 消息给用户显得尤为重要。

针对查询慢问题,DolphinScheduler 提供开箱即用的 Timeout 机制,允许用户为单个任务配置 Timeout Threshold,当任务运行时间超过了Timeout period 还没有运行成功时,将会触发 Timeout Strategy,Timeout Strategy 可以选择近发送 Alert 告警,或者发送 Alert 告警的同时, 标记任务为失败状态。这样,用户可以更好地运维湖仓一体中的任务。

f7417aa4f4a24231f886481aabd2230b.png

可能你会问了,标记任务失败之后,是否需要人为登陆DolphinScheduler系统重新运行任务呢?有没有更加智能的方式让任务失败之后可以自动被拉起呢?答案是 DolphinScheduler 的失败重试策略,你可以指定任务失败后重试的次数和间隔,如这个例子中, 我们配置了5次重试次数,每次重试间隔为 10 分钟,这样做能有效减少源数据库有压力时候人为介入处理的次数,让工作流运行更加流畅。当任务失败的次数被超过了设置的5次后,任务将会被标记失败,并且不会重新运行。

f58bea48b46c3cdac8d91d0b73d8bf1c.png

大量任务并发调度

Trino 可以支持大量SQL并发运行,我们自然不希望引入了workflow orchestration 并编排了调度之后会影响到 Trino 的并发数,这就要求 workflow orchestration 工具可以支持多任务并发,DolphinScheduler 是一个无中心的架构, 任务调度核心流程相关的 Master 和 Worker 都支持水平扩展,保证单位时间内运行更多的任务,经过测试 DolphinScheduler 3.0.2 可以在单台 8c16g 机器上每秒运行 40 个任务。

d3545c95efc9a2832f5fedb0587a330a.png

便于部署定时

用户完成湖仓一体任务的编排后,一般需要为不同的 workflow 配置不同的调度周期,保证 workflow 可以按照需要的频率新增或更新数据,DolphinScheduler 可以在 UI 上完成 workflow 定时配置,只需要在 workflow definition 中找到对应的工作流,点击 timing, 配置调度的 start time, end time,并配置 crontab 表达式,和时区,就能完成配置。当 workflow 有了定时后,DolphinScheduler 将在定时开始时启动 workflow 的运行。

5db93a2fadda3afff47d070c6832cd1f.png

补数

当完成 workflow 的编排并测试了基础功能后,我们再回到湖仓一体场景中,因为是面向历史的数据分析,所以不仅需要分析增量数据,还需要有历史全量数据。这时候,根据增量场景的代码完成数据 backfill 显得非常重要,我们不希望为增量数据和全量数据写两套代码,而是希望用同一套增量代码,通过不同的运行时间配置完成历史数据 backfill。湖仓一体提供了 Complement Data 的功能完成 data backfill。

如图,只需要在 trigger 选择 Complement Data 功能,选择backfill 的时间段,已经 backfill 的策略,点击 comfirm 就能完成 backfill 任务的触发。等全部的 backfill 任务运行完成,该时间段的历史数据也就全部就位了,如图中当任务完成的时候,我们就完成 2019-01-01 到 2022-01-01 历史数据的 backfill。

83888e54241bf0d6e1547429c4672b40.png

任务实例

DolphinScheduler 会保留每个 workflow 以及 task 的运行状态和记录,让用户更好地查找问题,并重跑 workflow 或者 task。意味着当你对 Trino 计算的数据有疑问时,你可以通过 workflow instance 或者 task instance 向前回溯 workflow。

  • 如果数据问题是由于源数据有问题,你可以将对应 workflow 做重运行

  • 如果是SQL代码更新导致的问题,你可以通过 DolphinScheduler 提供版本管理完成版本的回退

7300f7e530e0b7e8d0de34b03e2c03a7.png

04

Trino + DolphinScheduler

加上了 Apache DolphinScheduler 之后,数据仓库的最后一块拼图就完成了,同时解决了OLAP计算层面和任务调度层面的需求。至此,整体的架构图将如下图所示,只需要引入两个新组件,就能满足很长一段时间用户关系 OLAP 的需求了。

5e36735129f27f8d96ecd132592f737a.png

相关链接

Trino:https://trino.io/docs/current/overview.html

DolphinScheduler:https://dolphinscheduler.apache.org/#/en-us/docs/3.1.2/about/introduction

05

总结

这篇文章中,我们介绍了什么 Trino 、DolphinScheduler,以及它们分别解决了什么问题。通过构建湖仓一体的例子,我们分析了如何通过这两个工具满足公司的 OLAP 业务,同时引入尽可能少的组件,降低 infra 组件的维护成本,希望给有类似需求的小伙伴提供参考思路。

05

联合线上活动来啦!

DolphinScheduler 和 Trino 两大社区将基于 DolphinScheduler 和 Trino 的整合经历,以及对湖仓一体和数据处理领域的理解,共同举办一场线上 Talk Show,感兴趣的同学不要错过哦!

📆时间

2023 年 2 月 22 日,美国芝加哥时间上午 11:00–12:00 

注册报名:http://bit.ly/3YVfTty

👬嘉宾


Brian, Developer Advocate,Starburst Data, 致力于促进 Trino 社区发展。

William GUO(郭炜), Apache Foundation Member

Jay Chung(钟嘉杰), Apache DolphinScheduler PMC Member

David(代立冬), Apache DolphinScheduler PMC Chair


👬我们常年开放社区合作,欢迎联系我们进行社区合作,也欢迎来我们的活动进行基于 DolphinScheduler 的用户实践分享。

联系我们:zenghui@apache.org

debra.chen12@gmail.com

参与贡献

随着国内开源的迅猛崛起,Apache DolphinScheduler 社区迎来蓬勃发展,为了做更好用、易用的调度,真诚欢迎热爱开源的伙伴加入到开源社区中来,为中国开源崛起献上一份自己的力量,让本土开源走向全球。

123acf04ef49a57b7c73a892f227d441.png

参与 DolphinScheduler 社区有非常多的参与贡献的方式,包括:

d2d8228a867fe777606764f6b5764c3a.png

贡献第一个PR(文档、代码) 我们也希望是简单的,第一个PR用于熟悉提交的流程和社区协作以及感受社区的友好度。

社区汇总了以下适合新手的问题列表:https://github.com/apache/dolphinscheduler/issues/5689

非新手问题列表:https://github.com/apache/dolphinscheduler/issues?q=is%3Aopen+is%3Aissue+label%3A%22volunteer+wanted%22

如何参与贡献链接:https://dolphinscheduler.apache.org/zh-cn/community/development/contribute.html

来吧,DolphinScheduler开源社区需要您的参与,为中国开源崛起添砖加瓦吧,哪怕只是小小的一块瓦,汇聚起来的力量也是巨大的。

参与开源可以近距离与各路高手切磋,迅速提升自己的技能,如果您想参与贡献,我们有个贡献者种子孵化群,可以添加社区小助手微信(Leonard-ds) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

aa15d1eee5d919e0717b9c351700a0bf.jpeg

添加社区小助手微信(Leonard-ds) 

添加小助手微信时请说明想参与贡献。

来吧,开源社区非常期待您的参与。

< 🐬🐬 >

更多精彩推荐

Apache Spark + 海豚调度:PB 级数据调度挑战,教你如何构建高效离线工作流

☞Apache Dolphinscheduler 任务插件版图再添 Linkis,大幅提高计算治理能力

Apache DolphinScheduler 动态任务组件设计实现方案,减少前端代码

☞Apache DolphinScheduler 任务调度3.1.0版本源码剖析

☞名额已排到10月 | Apache DolphinScheduler Meetup分享嘉宾继续火热招募中

☞【Meetup讲师】您有一张社区认证讲师证书未领取,点击领取!

在 AWS 上部署无服务器 Apache DolphinScheduler 任务调度系统

我知道你在看c1fc234e94755fcd1774b22f481d9074.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
在3.6 trino二次开发中,动态数据源管理是一个非常重要的功能,它可以让用户在运行时动态地添加、删除和管理数据源。 在打包阶段,可能会出现一些问题,下面是一些常见的问题和解决方案的汇总: 1. 依赖管理问题:在打包阶段,可能会遇到依赖冲突或无法找到依赖的问题。解决这个问题的一种方式是使用Maven或Gradle等构建工具来管理依赖,并确保所有的依赖都是正确的版本。 2. 配置文件问题:动态数据源管理需要一些配置文件,可能会遇到找不到或读取失败的问题。解决这个问题的方法是检查配置文件的路径和命名是否正确,并确保配置文件中的参数是正确的。 3. 数据源注册问题:动态数据源管理需要在系统中注册数据源,可能会遇到注册失败或无法使用的问题。解决这个问题的方法是检查注册过程的代码逻辑是否正确,并确保注册的数据源是可用的。 4. 数据源连接问题:动态数据源管理需要在运行时连接和使用数据源,可能会遇到连接失败或无法查询的问题。解决这个问题的方法是检查连接过程的代码逻辑和连接参数是否正确,以及确保目标数据源是可访问的。 5. 安全性问题:动态数据源管理涉及到敏感的数据访问,可能存在安全性问题。解决这个问题的方法是在打包阶段加入安全控制的策略和机制,确保只有授权的用户可以访问和管理数据源。 总结起来,在3.6 trino二次开发中,动态数据源管理的打包阶段可能会遇到一些依赖、配置、注册、连接和安全性问题。要解决这些问题,需要仔细检查代码逻辑、配置参数和依赖管理,并确保数据源的可用性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DolphinScheduler社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值