Apache DolphinScheduler 6 月治理优化,补齐调度运维全链路细节
社区朋友们,今年 6 月份的社区月报来啦!不同于常规月度大版本功能迭代,本月 Apache DolphinScheduler 社区全力深耕底层治理!小伙伴们重点打磨了平台稳定性,比如完成 3.4.2 版本运维闭环、优化任务故障转移能力、修复高并发偶发故障、落地日志敏感数据脱敏,补齐部署、存储、CI 工程等各类线上细碎短板。
本篇月报,我们就带大家梳理一下 6 月份项目的核心生产变更、生产环境升级建议,并公布 6 月优秀社区贡献者榜单,下滑查看吧!✨
本月项目变更一览
- 统计范围:2026-06-01 至 2026-07-01
- 合并 PR:22
- 贡献者:9
- 代码变更:+630 / -473(
- 主要波及模块:Master、API、Storage、Helm、UI、Docs/治理
可以看到,6 月的项目变更更偏“发布维护 + 稳定性补强 + 文档完善”:既有 3.4.2 发布与相关修订,也有并发安全、日志脱敏、Helm 修复、S3 资源列表等实用改进。
适合谁看:
- 终端用户/业务方:想快速判断 6 月有没有值得关注的稳定性或可用性变化
- 运维/平台同学:重点关注 failover、Helm、S3、日志安全这几类上线影响面较大的改动
- 开发者:适合看 6 月社区把精力放在了哪些“治理型修复”上
对用户最有感的 6 件事
- 3.4.2 发布与修订已经落地
6 月包含 3.4.2 发布以及发布后文档修订,属于“版本维护月”的典型节奏。对应 PR:#18317、#18319 - Worker 日志更安全:避免明文密码落日志
对多租户/企业环境尤其关键:日志泄露往往比功能 bug 更“隐蔽且致命”。对应 PR:#18333 - Helm 使用体验修复与依赖更新
包含 ConfigMap label 冲突修复以及 MySQL chart 版本更新,直接影响部署体验与可维护性。对应 PR:#18341、#18336 - 并发安全修复:避免 ConcurrentModificationException
将 HashMap 替换为 ConcurrentHashMap,属于典型的“偶发但影响面大”的稳定性补强。对应 PR:#18331 - Failover 场景增强:任务 failover 时可 kill application
对 Yarn / K8s 等外部执行引擎更友好,避免任务切换后出现残留应用占资源。对应 PR:#18353 - S3 资源列表限制修复:不再只返回 1000 条
对依赖 S3 存储的用户是实际痛点修复,直接影响可见性与可用性。对应 PR:#18381
升级与验证建议
如果你是生产用户,建议按“发布维护类变更 + 稳定性补强”的思路做验证:
- 必回归:日志脱敏(敏感信息不落盘)、并发场景稳定性、存储(S3)资源可见性、Helm 部署升级
- 建议补充:发布版本相关的升级路径与文档一致性检查(特别是平台内嵌文档/链接)
建议在测试/集成环境保留以下拉取方式,作为后续补充 6 月数据前的标准动作:
gitfetch origin devgitcheckout devgitpull--rebase贡献者榜单
按本地提交 author name 统计,6 月参与提交的作者共 9 位:
- eye-gu、Jarek Potiuk、luxiaolong、njnu-seafish、suyc、Victor Laborie、Wenjun Ruan、xiangzihao、Yanjun Qiu
关键技术变更深度分析
1. 并发安全修复:把偶发异常前移到代码结构层解决
- 代表 PR:#18331
- 主要变更:
UserGroupInformationFactory中缓存UserGroupInformation的容器从HashMap改为ConcurrentHashMap,同时新增了专门的并发测试用例。 - 为什么重要:这类问题最麻烦的地方,不在于“会报错”,而在于“只会在高并发下偶发报错”。一旦 Hive 数据源登录与 Kerberos 续期线程并发访问同一份缓存,普通
HashMap在遍历和修改同时发生时,就可能触发ConcurrentModificationException。 - 这次修复的价值:社区没有只做一个“临时加锁”的热修,而是把核心共享结构替换成并发容器,再补上一组专门模拟
forEach + logout/login并发冲突的测试。这样修的不是表面现象,而是把问题从根上收掉。 - 对使用者的意义:如果你的环境里 Hive、Kerberos、长连接会话比较多,这类修复能明显降低“偶发失败、难以复现、重试又恢复”的灰色故障。
- 建议回归:重点看 Hive 相关任务、长时间运行后的 Kerberos 续期、以及高并发数据源访问场景。
2. Failover 逻辑增强:不仅切换任务,还主动处理外部残留应用
- 代表 PR:#18353
- 主要变更:新增
kill-application-when-task-failover配置项,并把它接入MasterConfig、TaskExecution以及多套部署配置文件中。 - 为什么重要:在调度系统里,failover 以前更多关注“调度状态能不能接上”,但对 Yarn、K8s 这类外部执行引擎来说,真正的风险常常在外部应用残留。调度端认为任务已经接管了,外部引擎里却还挂着旧 application,占资源、打日志、甚至继续跑。
- 这次修复的价值:它把 failover 从“只处理调度元数据”推进到“顺手处理执行现场”。从提交看,这个改动不仅改了 Master 代码,还同步补到了
application.yaml、docker-compose、Kubernetes values 和 README,说明它不是实验性质,而是打算给多种部署方式都提供统一开关。 - 对使用者的意义:对 Yarn/K8s 用户最有价值。以前一次 Master 异常之后,可能要同时处理任务状态恢复和外部资源清理;现在至少有了统一配置入口,可以把 failover 后的“残留 application”问题前置治理。
- 建议回归:模拟 Master 切换、任务执行中断、外部引擎 application 残留三类场景,确认开关启用后不会误杀正常任务,也不会放过应回收的 application。
3. S3 分页修复:从“看起来能用”到“数据量上来后还能用”
- 代表 PR:#18381
- 主要变更:
S3StorageOperator.listStorageEntity()从单次listObjectsV2调用,改成基于ContinuationToken的循环拉取,并补充了测试。 - 为什么重要:这是非常典型的“开发环境没问题,生产环境才暴露”的缺陷。S3 的
ListObjectsV2默认会分页,如果代码只取第一页,那么资源数量一旦超过 1000,就会出现“明明文件在,但列表里看不到”的问题。 - 这次修复的价值:修复点非常直接,也很规范。它没有去做业务层补丁,而是在存储插件底层把分页遍历补完整,直到
isTruncated()为假才结束。这样上层资源中心、文件管理、目录浏览这些依赖存储列举能力的功能,都会一起受益。 - 对使用者的意义:只要你的 S3 桶里资源规模大、目录层级深,或者本来就把 DolphinScheduler 当统一资源入口,这个修复就是“真问题真收益”,不是优化体验,而是恢复正确性。
- 建议回归:准备超过 1000 条对象的目录、混合目录与文件的前缀结构,确认 UI/API 列表结果与实际桶内对象数一致。
4. 日志脱敏:改动很小,但安全收益很大
- 代表 PR:#18333
- 主要变更:从 diff 看,这个提交只改了
PasswordUtils一处代码,行数变化非常小。 - 为什么依然值得单独讲:安全类改动不能只按“改了多少行”判断价值。密码明文出现在日志里,往往不是立刻导致任务失败,而是把风险埋进日志平台、排障工单、备份归档和多人协作链路里,影响范围反而更广。
- 这次修复的价值:它说明 6 月社区不仅在修功能 bug,也在补“默认安全”细节。很多真实事故不是权限系统失守,而是普通日志把不该出现的信息带出来;这类修复属于投入小、收益大的治理型改动。
- 对使用者的意义:如果你们已经把 Worker 日志接入 ELK、SLS、CloudWatch 这类集中式日志系统,这个改动的意义会比单机部署更大,因为日志一旦被汇聚,泄露面会指数级放大。
- 建议回归:重点检查连接配置打印、异常栈、脱敏后日志是否仍保留足够排障信息,避免“安全性上去了,可观测性没了”。
方向映射
把 6 月这 22 个 PR 放回长期演进方向来看,本月更像一次“把边边角角但高频会踩的坑补齐”的维护窗口:
- 发布与治理:#18310、#18317、#18319、#18363、#18374、#18375
- 运行时稳定性:#18331、#18347、#18351、#18352、#18353
- 云原生与部署:#18336、#18341、#18355、#18360
- 安全与合规:#18310、#18333、#18363
- 生态与存储:#18381
- 文档与用户体验:#18321、#18323、#18327、#18308
如果用一句话概括 Apache DolphinScheduler 项目在 6 月的变更,即不是“大功能月”,而是“把发布、部署、调度恢复和安全细节继续补平”的一个治理月。
附录 A:2026 年 6 月合并 PR 明细
2026-06-02#18310Add AGENTS.md + SECURITY.md to make the security model discoverable2026-06-04#18317Release 3.4.22026-06-04#18319Hotfix 3.4.2 doc error2026-06-05#18321Update the parameter priority explanation in the docs2026-06-05#18323Add a note to the parameter priority documentation specifying and fix some issues2026-06-07#18316Remove dead code aftert_ds_relation_user_alertgrouptable dropped2026-06-10#18331Replace HashMap with ConcurrentHashMap inUserGroupInformationFactory2026-06-12#18341Fix duplicateapp.kubernetes.io/namelabel on ConfigMap2026-06-12#18333Remove plaintext passwords from the logs2026-06-12#18336Update mysql helm chart version2026-06-15#18347countTaskInstanceStateByProjectCodesusessubmit_timefiltering2026-06-16#18327Fix and enrich the documentation for parameter priority2026-06-16#18355Change the description field to optional2026-06-17#18353Addkill-application-when-task-failoverlogic2026-06-17#18352Fix rerun workflow instance should follow the specifiedworkerGroup2026-06-18#18360Change the description field to optional in k8s config2026-06-22#18351FixforceTaskSuccesscannot reset the last unsuccessful workflow instance to success2026-06-22#18363Fix sonar token leak2026-06-23#18374Remove sonar check2026-06-23#18375Fix auto labeler error2026-06-23#18308Frontend correctly uses the preferred values of the associated project for task creating and workflow scheduling2026-06-26#18381Fix list resources returned only 1000 records in s3 storage type
附录 B:参考链接
- PR #18308: https://github.com/apache/dolphinscheduler/pull/18308
- PR #18310: https://github.com/apache/dolphinscheduler/pull/18310
- PR #18316: https://github.com/apache/dolphinscheduler/pull/18316
- PR #18317: https://github.com/apache/dolphinscheduler/pull/18317
- PR #18319: https://github.com/apache/dolphinscheduler/pull/18319
- PR #18321: https://github.com/apache/dolphinscheduler/pull/18321
- PR #18323: https://github.com/apache/dolphinscheduler/pull/18323
- PR #18327: https://github.com/apache/dolphinscheduler/pull/18327
- PR #18331: https://github.com/apache/dolphinscheduler/pull/18331
- PR #18333: https://github.com/apache/dolphinscheduler/pull/18333
- PR #18336: https://github.com/apache/dolphinscheduler/pull/18336
- PR #18341: https://github.com/apache/dolphinscheduler/pull/18341
- PR #18347: https://github.com/apache/dolphinscheduler/pull/18347
- PR #18351: https://github.com/apache/dolphinscheduler/pull/18351
- PR #18352: https://github.com/apache/dolphinscheduler/pull/18352
- PR #18353: https://github.com/apache/dolphinscheduler/pull/18353
- PR #18355: https://github.com/apache/dolphinscheduler/pull/18355
- PR #18360: https://github.com/apache/dolphinscheduler/pull/18360
- PR #18363: https://github.com/apache/dolphinscheduler/pull/18363
- PR #18374: https://github.com/apache/dolphinscheduler/pull/18374
- PR #18375: https://github.com/apache/dolphinscheduler/pull/18375
- PR #18381: https://github.com/apache/dolphinscheduler/pull/18381
