点击蓝字 关注我们
文|程鑫
编辑整理| 曾辉
讲师介绍
程鑫
阿里云 研发工程师
自我介绍
我叫程鑫, GitHub ID 是 rickchengx,来自阿里云的 EMR 数据开发团队,也是 DolphinScheduler 社区的一名比较活跃的贡献者,为社区贡献了多个不同的远程日志存储和资源中心的存储类型插件。
远程日志存储机制分享
首先,我会简单介绍一下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远程日志存储机制的分享。
开源经历分享
接下来,我会分享我在参与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,好友申请注明“入交流群+姓名+公司+职位信息“,群里是实名制,仅用于验证身份)
添加小助手微信时请说明想参与贡献。
来吧,开源社区非常期待您的参与。
☞Apache DolphinScheduler 荣获“掘进技术引力榜”「2023 年度 ROBUST 开源项目」奖项!






