暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

为复杂云原生场景而生的 Apache DolphinScheduler 远程日志存储机制 | 附案例

海豚调度 2023-07-07
474



点击蓝字 关注我们





 


大家好,非常荣幸能够来到 DolphinSchedule 和SeaTunnel 社区联合组织的 Meetup。我今天给大家分享的主题是《Apache DolphinScheduler远程日志存储机制分享》。


程鑫

编辑整理 曾辉



讲师介绍


程鑫

阿里云 研发工程师


01

 自我介绍



我叫程鑫, GitHub ID 是 rickchengx,来自阿里云的 EMR 数据开发团队,也是 DolphinScheduler 社区的一名比较活跃的贡献者,为社区贡献了多个不同的远程日志存储和资源中心的存储类型插件。


02

远程日志存储机制分享



首先,我会简单介绍一下Apache DolphinScheduler的架构,这对于我们理解远程日志存储的目的非常有帮助。我们可以参考Apache DolphinScheduler官方网站上的架构图。从上至下,最上面是用户交互的前端页面,即UI层。


紧接着的是API server层,它提供了restful的接口供外部请求服务。



下面是master server层,它的主要功能是切分工作流的DAG,并监控任务状态等。然后是worker server层,它主要执行任务,同时提供日志服务。


远程日志存储简单来说就是将任务执行的日志存储在远端存储上。远端存储的target可以是多种类型的,如AWS的S3,Google的Cloud Storage (GCS),以及阿里云的对象存储OSS等。


在进入远程日志存储的细节之前,我们先看一下Apache DolphinScheduler目前的日志获取机制。


在Apache DolphinScheduler中,日志分为两部分:

一是组件日志,包括API server、master server、worker server等组件的日志;

二是任务日志,包括worker上和master上的任务日志。


任务日志的获取路径如下:用户在Apache DolphinScheduler前端点击查看或下载任务日志,请求首先发送给API server,然后API server通过worker server提供的netty接口读取日志。


那么我们为什么需要远程日志存储呢?首先,在一些特定场景,尤其是云原生场景下,我们可能需要将任务日志存储在远端。例如,在K8s环境下,如果没有挂载持久卷,worker pod重启后任务日志就会丢失。通过远程日志存储,我们可以将任务日志发送到远端存储,从而避免这个问题。


其次,远程日志存储支持K8S executor场景下的任务日志读取。在这种情况下,scheduler会在k8s集群上动态拉起一个worker pod执行任务,任务结束后,pod就会被销毁,此时任务日志需要通过远程日志存储进行收集。


第二,远程日志存储可以用作备份存储,我们可以将本地任务日志上传到远端存储,然后删除本地文件,避免占用过多的本地磁盘资源。


最后,远程日志存储提供了集中式存储,所有worker上的任务日志都可以发送到远程存储,进行统一查询和分析。


接下来,我们看一下远程日志存储的设计目标。我列出了三点:


首先是轻量级,因为Apache DolphinScheduler的日志模块在设计之初就考虑到了轻量级。我们知道,日志获取并不是大数据调度的核心模块或功能,所以我们不希望引入复杂的功能,增加Apache DolphinScheduler的复杂性。


第二是可扩展性,我们期望Apache DolphinScheduler的远程日志存储能够支持各种不同类型的远程存储。为此,我们采用插件式设计,使得增加新类型的远程存储变得方便。


第三是易用性,我们期望用户只需进行一些简单的配置,就可以轻松地使用远程日志存储。


接下来,我们会详细探讨远程日志存储的具体实现细节。



首先,我们来看日志写入。写入操作的时机是在任务完成后,无论任务执行成功,执行失败,还是发生异常,worker都会将日志发送到远程存储。这个过程是通过异步方式进行的,我们会用一个线程池异步地写入远程存储,避免日志写入影响任务执行流程。



还计划支持分段上传日志的功能,通过缓存机制,可以分段地将日志通过追加方式发送到远程存储。这种方式可以在一定程度上避免在写入日志时,worker出现问题导致无法发送完整的日志到远程存储的情况。


第二部分是日志读取,也就是如何从远程日志中读取日志。当用户在前端界面上下载或浏览任务日志时,API服务器会请求worker提供日志。如果涉及到远程日志,可能会有两条路径。



第一条路径是API服务器首先按照正常流程请求worker提供日志。worker会首先读取本地文件系统,如果本地文件中有任务日志,那么它就直接返回给API服务器。如果本地没有这个任务日志,worker会请求远程存储提供任务日志。


第二条路径是在worker不存在或者已销毁的情况下,worker返回给API服务器的日志是空的。在这种情况下,API服务器需要直接从远程存储获取任务日志。


这两条路径的设计初衷是尽可能减少Apache DolphinScheduler系统对外的IO消耗。我们的原则是,如果本地有日志,我们就直接返回本地的日志给用户。如果本地没有,我们才会一步一步地从外部请求。我们也计划支持从远程存储滚动读取任务日志的功能。这可以避免由于日志过大导致的内存溢出问题。


第三部分,我们要讨论的是任务日志的留存机制。我们之前提到过,我们的设计目标是保持轻量级,所以我们选择利用远端存储本身的日志留存机制,而没有将日志留存机制集成到Apache DolphinScheduler中。



比如,目前我们支持的S3、GCS、OSS这三种存储类型都有自己的日志留存机制,它们都支持设置对象的生命周期,例如,我们可以设置30天后自动删除任务日志,以此来实现我们的日志留存。


远端日志存储目前是以插件式设计的,目前支持S3、GCS、OSS作为远端存储



如果你想贡献一个新的存储类型插件,其实非常简单,只需要实现两个函数,一个是sendRemoteLog,将日志发送到远程存储,另一个是getRemoteLog,从远程存储中获取日志。


接下来是关于如何使用远程日志存储的示例。


配置主要分为两部分,一部分是通用配置,无论你使用何种存储类型,都需要进行的配置。首先,有一个开关选项,可以开启或关闭远程日志功能。启用后,你可以设置目标类型,目前支持的有三种。


然后,你可以设置日志存放的基目录,以及我们之前提到的异步发送日志的线程池大小。



另一部分是特定于存储类型的配置。比如,如果你的目标是Google Cloud Storage,你需要设置GCS的凭证以完成鉴权,以及存储日志的bucket名称。

可以看出,用户只需要进行简单的配置,就能使用远程日志功能。在Apache DolphinScheduler的界面上,如果你开启了远程日志功能,你会看到一条消息,表明日志已经被发送到远程存储。同时,在GCS的文件列表中,你也可以找到对应的任务日志。


以上就是关于Apache DolphinScheduler远程日志存储机制的分享。


03

开源经历分享




接下来,我会分享我在参与Apache DolphinScheduler开源社区的一些贡献经

历。我第一次提交PR是在去年的8月,是一个与文档相关的简单更新。


通过这次PR,我初步了解了贡献的流程,也学会了如何为开源社区做出贡献。到现在,我已经提交了40多个PR,主要内容包括远程日志存储机制,不同类型的存储插件,资源中心对GCS的支持,以及一些其他的改进,比如权限检查,单元测试,k8s任务类型等等。



在参与Apache DolphinScheduler社区的贡献过程中,我深深地体验到了社区的独特氛围。这是一个以平等、开放和包容为主导的社区。每次提交的PR,无论是社区的committer还是PMC,他们都会非常热心地进行代码的review,并给出建设性的建议。

从我的角度分享一些为什么参与开源社区的原因。首先,参与社区的过程实际上是提升个人竞争力的过程。为什么这么说呢?每一次向社区的贡献,实际上都是一次互相学习的过程。这包括学习开源社区本身的代码,以及在提交PR过程中与reviewer的讨论。例如,当我在参与社区junit升级的时候,遇到了一个E2E测试的问题,由于我对其中一些框架不熟悉,reviewer给出了很好的建议,通过这种交流,我学到了很多之前不知道的知识。



第二,参与开源社区也是提升个人知名度的一个机会。我们所有人对社区的贡献都是公开的,所有人都可以看到,所以每一次贡献都能够增加自己的曝光度。同时,对于我们编码者来说,GitHub实际上是我们的一个简历,每一次贡献的过程都是丰富我们简历的过程。


第三,我们可以通过这个过程提升自己的成就感。每一次的PR提交实际上都是对我们开源软件的一个改进,随着你的PR被merge并发布,很多人都会因此受益,这会让你感到非常有成就感。每一次的PR讨论,实际上都是一个互相帮助的过程。

那么,如何提交一个有价值的贡献,或者说如何提交一个好的PR呢?首先,我们需要仔细阅读工作须知,这些须知可能包括一些像code of conduct,PR NOTICE,LICENSE NOTICE,README等等文档。通过这些文档,我们可以熟悉并理解社区的一些规则,避免我们的PR在review之前就被拒绝。



在提交前,我们需要仔细检查和校验。一个好的PR应该尽可能地给出一些我们自己的验证结果,如截图,或者添加一些单元测试等等。这样可以节省reviewer的一些时间和精力,也可以帮助reviewer更有信心地给我们的PR一个approve。



另外,我认为在提交PR的过程中,详尽的沟通和能够直面批评是非常重要的。我们经常说,Apache社区讲的是"community over code",即社区的协作比代码本身更加重要。每一个reviewer的意见都需要被认真对待。


最后,非常荣幸今天能够做这样一个分享。谢谢大家!

参与贡献


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


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


贡献第一个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) ,手把手教会您( 贡献者不分水平高低,有问必答,关键是有一颗愿意贡献的心 )。

添加社区小助手微信(Leonard-ds,好友申请注明“入交流群+姓名+公司+职位信息“,群里是实名制,仅用于验证身份) 



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


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



< 🐬🐬 >
更多精彩推荐

优秀用户案例有奖征集 | 活动火热开启,快来投稿!

用一杯星巴克的钱,训练自己私有化的ChatGPT

社区星力量 | 平等、包容、耐性,这对贡献小白来说很重要

☞去年办了这么多场Meetup都没有你,2023年赶紧安排起来!

助力长城汽车数据管道平台连接“数据孤岛”,加强数据一元化,Apache DolphinScheduler 的角色定位

Apache DolphinScheduler 荣获“掘进技术引力榜”「2023 年度 ROBUST 开源项目」奖项!



欢迎点赞在看

文章转载自海豚调度,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论