点击上方 蓝字关注我们

✎ 编 者 按

在今年由中国科学院软件研究所主办的开源软件所供应链点亮计划-开源之夏活动中,有不少小伙伴提交了关于 DolphinScheduler 的项目,本期是来自成都信息工程大学的张树坤带来的项目经验分享。

项目总体设计为设置工作流为空跑状态,以测试整个工作流执行是否正确功能的开发。该功能通过 flag 标记在 Matser 与 Server 间的传递实现,同时考虑到系统的容错设计。难点在于涉及系统的核心处理流程,Master 执行 Scheduler 处理工作流的 DAG,Worker 获取任务负责具体的执行,两者通过 Zookeeper 进 行通信。该项目使用 SpringBoot 框架,使用 Java 语言进行开发。

项目名称

⼯作流级别任务空跑(后端)

项目方案描述

1. 修改数据表

在以下数据表中增加空跑字段。

1. t_ds_command

2. t_ds_error_command

3. t_ds_process_instance

4. t_ds_task_instance

2. api模块的接⼝修改

1. ExecutorController:startProcessInstance接⼝增加空跑DryRun参数

  1. ExecutorService:execProcessInstance⽅法增加空跑参

  2. ExecutorServiceImpl:execProcessInstance:增加形参并修改逻辑

  3. ExecutorServiceImpl:createCommand:增加形参并修改逻辑

2. TaskInstanceController:在list-paging的返回值中增加空跑参数,所以只需在Mapper.xml中增加查询的字段值

3. ProcessInstanceController:在list-paging的返回值中增加空跑参数,只需要在对于xml⽂件的queryProcessInstanceListPaging增加查询参数

4. 测试类:修改ExecutorControllerTest及ExecutorService2Test中的测试⽅法,通过测试

3. dao模块修改

1. entity:在以下实例类中增加dryRun字段,相应的Getter和Setter,修改构造⽅法、toString等

a. Command

b. ErrorComand

c. ProcessInstance

d. TaskInstance

2. mapper:相关查询中增加空跑字段

a. CommandMapper.xml

b. ProcessInstanceMapper.xml

c. TaskInstanceMapper.xml

4. server模块修改

1. master包:

a. MasterExecThread:createTaskInstance:把空跑字段由processInstance传递到taskInstance

2. worker包:

a. TaskExecuteThread:**跳过空跑的实际逻辑位置**,根据空跑标记跳过实际执⾏部分,直接把状态修改为成功

5. service模块修改

1. process包:

a. ProcessService:调⽤Command构造⽅法的地⽅增加空跑字段

b. 测试类ProcessServiceTest:增加空跑字段使测试通过

6. 容错处理

实际上就是在上述两个.xml⽂件中,在查询时增加空跑字段,就能分别保证master和worker容错。(已经在server模块中进⾏了修改)

时间规划

时间(周)

要完成的⼯作

1

搭建本地开发环境,建⽴本地数据库,与导师交流沟通项⽬细节

2

完成增加相关api的空跑字段并进⾏功能测试

3

完成流程定义到流程实例,流程实例到任务实例空跑标记的传递并进⾏测试

4

完成流程、任务实例增加空跑字段后持久化到数据库、任务执⾏时跳过实际 执⾏

5

完成master和worker的容错设计并测试

6(中期审核8.15)

完成前期安排中未完成的任务

7

与前端交接,进⾏接⼝和功能测试,修复bug

8

与前端交接,进⾏接⼝和功能测试,修复bug

9

编写整体流程的测试,修复bug

10

整理源码并提交pull Request

11-12

进⼀步参与社区其他issue问题的修复

项目总结

项目产出

在开发⼯作流时,对于较为复杂的依赖关系,可以设置⼯作流为空跑状态,以测试整个⼯作流执⾏是否正确。查看/修改⼯作流、查看⼯作流实例、任务列表接⼝,增加是否空跑字段,Master节点调⽤Worker节点时,新增是否空跑字段 ,Worker节点判断是否空跑标记,空跑则打印⽇志,直接按成功处理。

项⽬的pr链接:https://github.com/apache/dolphinscheduler/pull/6104

下⾯是运⾏截图:

方案进度

遇到的问题及解决⽅案

1. 在TaskExecuteThread中编写世纪跳过空跑部分的代码时,需要获取TaskInstance的空跑字段值, 我考虑通过id使⽤ProcessService提供的findTaskInstanceById⽅法查询taskInstace实例,但是使⽤注解进⾏注⼊却发现产⽣了空指针异常,获取不到ProcessService这个bean。

  • 经过阅读报错信息和查询资料,发现原因是在多线程环境下,单独开的线程中不能使用@Autowired等注解注⼊对象,从⽽导致 java.lang.NullPointerException。应该从 Spring 容器中获取该对象进⾏引⽤。

2. 在pull到最新版代码的时候,发现⽆法启动master,但是通过阅读报错信息没有找到解决⽅法,排 除 了很多种可能性,最后通过打开了配置⽂件的注解,就可以顺利运⾏。

  • 官⽹的⽂件应该更新⼀下这⾥,我觉得应该还会有⼈踩坑吧hh

  • 通过这个启动问题,梳理了jvm加载配置⽂件的思路,弄清楚了导致问题的原因。我重写git   clone⼀份新代码复现这个问题的时候,发现仍会有⼀个找不到target/classes的报错,于是我使⽤maven install把dolphinscheduler-registry-plugin编译后,问题解决。

3. 空跑字段使⽤int类型⽽不是包装类型Integer,因为使⽤int默认值为0⽽使⽤Integer默认为null,可 能会导致⼀些问题,⼀般情况下默认都是使⽤int类型。

4. worker启动时报错的解决⽅案,把worker.properties⽂件改成下⾯的样⼦,就可以正常运⾏:

#task.plugin.dir=lib/plugin/task

#maven.local.repository=/Users/localRepository

#task.plugin.binding config the task plugin need be load when development and
run in IDE
task.plugin.binding=./dolphinscheduler-task-plugin/dolphinscheduler-task-
shell/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
python/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
sql/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
procedure/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
http/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
datax/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
tis/pom.xml,./dolphinscheduler-task-plugin/dolphinscheduler-task-
sqoop/pom.xml

项目完成质量

基本完成项⽬的⽬标,在写代码过程中产⽣的问题也得到了解决,⾃我评价良好。

与导师沟通及反馈情况

这⼀个阶段的参与我深刻认识到了沟通交流的重要性,感谢⽼师细致和不厌其烦的解答,⽼师的指导起到了决定性和⽅向性的作⽤。虽然导师本职⼯作也⽐较忙,但是仍然抽出时间和我们交流,给我们学习和参加校招以及⼯作上的建议,让我感觉很有收获。

社区官网

https://dolphinscheduler.apache.org/

代码仓地址https://github.com/apache/dolphinscheduler

您的 Star,是 Apache DolphinScheduler 为爱发电的动力️ 

任何 DolphinScheduler 相关分享

欢迎添加社区小助手微信投稿

(Leonard-ds)

☞DolphinScheduler 在绿瘦的实践成果,开启了我的开源之路!

欧洲研究机构 MERICS:中国开发者是 GitHub 第二大多产贡献者群体,迎头赶上世界一流水平!

最佳实践 | 联通数科基于 DolphinScheduler 的二次开发

DolphinScheduler 荣获 2021 中国开源云联盟优秀开源项目奖!

议题征集令 | Apache DolphinScheduler Meetup 2021 来啦,议题征集正式开启!

☞重构、插件化、性能提升 20 倍,Apache DolphinScheduler 2.0 alpha 发布亮点太多!

点击阅读原文,加入开源!

点个在看你最好看

DolphinScheduler 功能开发:⼯作流级别任务空跑(后端),测试工作流是否正确执行...的更多相关文章

  1. [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  2. 微信公众号开发 [05] 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  3. 8个必备的PHP功能开发

    这篇文章主要介绍了8个必备的PHP功能开发,需要的朋友可以参考下 PHP开发的程序员应该清楚,PHP中有很多内置的功能,掌握了它们,可以帮助你在做PHP开发时更加得心应手,本文将分享8个开发必备的PH ...

  4. MAVLink功能开发,移植教程。

    MAVLink功能开发 -----------------本文由"智御电子"提供,同时提供视频移植教程,以便电子爱好者交流学习.---------------- 1.MAVLink ...

  5. JFinal使用笔记3-注册和登录功能开发记录

    首页 开源项目 问答 代码 博客 翻译 资讯 移动开发 招聘 城市圈 当前访客身份:游客 [ 登录 | 加入开源中国 ]   当前访客身份: 游客 [ 登录 | 加入开源中国 ] 软件   土龙 关注 ...

  6. Go语言学习教程:管理员登录功能开发

    学习完了数据库操作的知识以后.本节内容,我们将实现管理员登陆功能,涉及到多个模块的代码实现和逻辑处理,以及数据库表的操作,都将在本节内容中进行实现. 管理员结构体定义 首先我们要定义管理员这个实体的结 ...

  7. F2BPM作流引擎系列索引

    索引如下 F2工作流引擎遵循参考WFCM标准规范,符合中国国情特色,更轻量级的工作流引擎,支持多种数据库(mmsqlserver,mysql,oracle),有强大智能的组织模型接口可快速应用到任何基 ...

  8. 手把手教你 Apache DolphinScheduler 本地开发环境搭建 | 中英文视频教程

    点击上方 蓝字关注我们 最近,一些小伙伴反馈对小海豚的本地开发环境搭建过程不太了解,这不就有活跃的贡献者送来新鲜的视频教程!在此感谢@Tianqi-Dotes 的细致讲解 贡献者还贴心地录制了中英文两 ...

  9. 转-servlet 获取 post body 体用流读取为空的问题

    目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式.在Java servlet或者springmvc中可以通过如下代码来获取并图片通过流方式传输 ...

随机推荐

  1. Yaml中特殊符号"| > |+ |-"的作用

    "|",保留每行尾部的换行符\n. ">",删除每行尾部的换行符\n,则看似多行文本,则在程序中会将其视为一行. include_newlines: | ...

  2. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  3. 历经70+场面试,我发现了大厂面试的bug,并总结其中心得

    想起了学弟在去年秋招时面试了50余家,加上暑期实习面试了20余家,加起来也面试了70余场. 基本把国内有名的互联网公司都面了一遍,不敢说自己的面试经验很丰富,但也是不差的. 这次专门把大厂的面试做了个 ...

  4. Docker搭建大数据集群 Hadoop Spark HBase Hive Zookeeper Scala

    Docker搭建大数据集群 给出一个完全分布式hadoop+spark集群搭建完整文档,从环境准备(包括机器名,ip映射步骤,ssh免密,Java等)开始,包括zookeeper,hadoop,hiv ...

  5. python自动将新生成的报告作为附件发送并进行封装

    发送报告作为自动化部署来讲是一个重要的环节,废话不多说直接上代码吧,如果想更细致的了解内容查阅本博主上篇基本发送文章 特别叮嘱一下:SMTP协议默认端口25,qq邮箱SMTP服务器端口是465 别出丑 ...

  6. CabloyJS v3.1.0支持集群及更多 🎉

    在抗疫期间,CabloyJS v3.1.0设计并开发了大量特性,并且所有相关文档已集齐.强烈建议大家试用,拍砖 特性 - 后端核心 集群: 集群现在已经成为CabloyJS的一等公民.也就是说,Cab ...

  7. 一文带你了解J.U.C的FutureTask、Fork/Join框架和BlockingQueue

    摘要: J.U.C是Java并发编程中非常重要的工具包,今天,我们就来着重讲讲J.U.C里面的FutureTask.Fork/Join框架和BlockingQueue. 本文分享自华为云社区<[ ...

  8. Redis初启(一)

    1.数据库存存储性能优化 在mysql的文章专题中我写过了关于传统关系型数据库的一些优化思路,整体来说,通过优化之后能够提升程序访问数据库的计算性能.但是还是有一些情况,即便是优化之后,使用传统关系型 ...

  9. Event Loop我知道,宏任务微任务是什么鬼?

    在介绍宏任务和微任务之前,先抛出一个问题.相信大家在面试的时候,会遇到这样的相似的问题: setTimeout(function(){undefined console.log('1') }); ne ...

  10. WinSCP和PuTTY的安装和使用

    简介 WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件. 安装 1.下载地址:https://www. ...