一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源

DolphinScheduler 数据源 \\x26amp; Task 插件机制详细分析。


点亮⭐️  

https://github.com/apache/DolphinScheduler



点击蓝字 关注我们



一、整体架构概览


DolphinScheduler 的插件体系基于 Java SPI(Service Provider Interface) 机制,配合 Google AutoService 自动生成注册文件,实现了零侵入的插件化扩展。

dolphinscheduler-spi                    ← 核心接口层(SPI基础设施)dolphinscheduler-datasource-plugin      ← 数据源插件层dolphinscheduler-task-plugin            ← Task插件层dolphinscheduler-worker                 ← 插件消费层(Worker执行任务)

二、SPI基础设施



PrioritySPI (接口)  └── getIdentify(): SPIIdentify  ← 插件唯一标识 + 优先级  └── compareTo(Integer)          ← 优先级比较

PrioritySPIFactory 是插件发现的核心引擎

通过 Java 标准 ServiceLoader 扫描 classpathfor (T t : ServiceLoader.load(spiClass)) {    if (map.containsKey(t.getIdentify().getName())) {        resolveConflict(t);   // 同名插件按优先级决策,优先级相同则抛异常    } else {        map.put(t.getIdentify().getName(), t);    }}

插件注册方式:每个插件模块使用 @AutoService 注解,编译时自动在 META-INF/services/ 下生成 SPI 配置文件,无需手动维护

三、数据源插件详细教程


3.1 接口层次结构

DataSourceChannelFactory (SPI入口)  └── getName()          ← 插件唯一名称,如 "MYSQL"  └── create()           ← 创建 DataSourceChannelDataSourceChannel (通道)  └── createAdHocDataSourceClient()    ← 创建临时连接客户端  └── createPooledDataSourceClient()   ← 创建连接池客户端DataSourceClient (基础接口)  └── getConnection(): ConnectionPooledDataSourceClient extends DataSourceClient  └── createDataSourcePool()           ← 创建 HikariCP 连接池

3.2 以 MySQL 为例的完整实现链

MySQLDataSourceChannelFactory          ← @AutoService 注册  └── create() → MySQLDataSourceChannel        └── createPooledDataSourceClient() → MySQLPooledDataSourceClient              └── extends BasePooledDataSourceClient                    └── createDataSourcePool() → HikariDataSource                          ├── setDriverClassName()                          ├── setJdbcUrl()                          ├── setUsername() / setPassword()                          ├── setMinimumIdle() / setMaximumPoolSize()                          └── setConnectionTestQuery()

四、Task插件详细流程


4.1 接口层次结构

TaskChannelFactory (SPI入口) extends UiChannelFactoryPrioritySPI  └── getName()          ← 插件类型名,如 "SHELL"  └── create()           ← 创建 TaskChannel  └── getParams()        ← 返回 UI 配置参数(前端渲染用)TaskChannel (通道)  └── createTask(TaskExecutionContext) → AbstractTask  └── parseParameters(ParametersNode) → AbstractParameters  └── getResources(parameters)        → ResourceParametersHelper  └── cancelApplication(boolean)AbstractTask (任务执行基类)  └── init()             ← 初始化  └── handle(callback)   ← 执行(抽象)  └── cancel()           ← 取消(抽象)  └── getExitStatus()    ← 根据 exitCode 返回状态

4.2 以 Shell 为例的完整实现链

ShellTaskChannelFactory                ← @AutoService 注册  └── getName() → "SHELL"  └── getParams() → [nodeName, runFlag, ...]  ← 前端UI参数  └── create() → ShellTaskChannel        └── createTask(ctx) → ShellTask              └── handle(callback)                    └── ShellCommandExecutor.run(shellActuatorBuilder)                          └── 执行 Shell 脚本进程

五、两种插件的关键对


原文链接:https://segmentfault.com/a/1190000047676462



END






用户案例


DolphinScheduler Agent开源上线Cisco Webex天翼云Zoom网易邮箱 每日互动 惠生工程作业帮 博世智驾蔚来汽车 长城汽车集度长安汽车思科网讯食行生鲜联通医疗联想新网银行兴业证券唯品富邦消费金融 自如有赞伊利当贝大数据珍岛集团传智教育BigoYY直播  拈花云科太美医疗深圳某智能制造企业



迁移实战


Azkaban   Ooize(当贝迁移案例)airflow (有赞迁移案例)Air2phin(迁移工具)Airflow



最新发版消息



Apache DolphinScheduler 3.4.2 正式发布!新增 Amazon EMR Serverless 插件,增强监控与补数据能力



加入社区


关注社区的方式有很多:

  • GitHub: https://github.com/apache/dolphinscheduler
  • 官网:https://dolphinscheduler.apache.org/en-us
  • 订阅开发者邮件:dev@dolphinscheduler@apache.org(向邮箱发送任意内容,收到邮件后回复同意订阅即可)
  • X.com:@DolphinSchedule
  • YouTube:https://www.youtube.com/@apachedolphinscheduler
  • Slack:https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-1cmrxsio1-nJHxRJa44jfkrNL_Nsy9Qg

同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。

非代码方式包括:

完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。

‍代码方式包括:

查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。

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

社区汇总了以下适合新手的问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3A%22first+time+contributor%22

优先级问题列表https://github.com/apache/dolphinscheduler/pulls?q=is%3Apr+is%3Aopen+label%3Apriority%3Ahigh

如何参与贡献链接https://dolphinscheduler.apache.org/zh-cn/docs/3.2.2/%E8%B4%A1%E7%8C%AE%E6%8C%87%E5%8D%97_menu/%E5%A6%82%E4%BD%95%E5%8F%82%E4%B8%8E_menu

如果你❤️小海豚,就来为我点亮Star吧!

https://github.com/apache/dolphinscheduler



你的好友小海豚拍了拍你

并请你帮她点一下“分享”