✎ 编 者 按
在今年由中国科学院软件研究所主办的开源软件所供应链点亮计划-开源之夏活动中,有不少小伙伴提交了关于 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参数
- ExecutorService:execProcessInstance⽅法增加空跑参
- ExecutorServiceImpl:execProcessInstance:增加形参并修改逻辑
- 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
项目完成质量
基本完成项⽬的⽬标,在写代码过程中产⽣的问题也得到了解决,⾃我评价良好。
与导师沟通及反馈情况
这⼀个阶段的参与我深刻认识到了沟通交流的重要性,感谢⽼师细致和不厌其烦的解答,⽼师的指导起到了决定性和⽅向性的作⽤。虽然导师本职⼯作也⽐较忙,但是仍然抽出时间和我们交流,给我们学习和参加校招以及⼯作上的建议,让我感觉很有收获。