
点亮⭐️
https://github.com/apache/
点击蓝字 关注我们
在 Apache DolphinScheduler 中,多租户并不是一个“权限附属功能”,而是调度系统的核心执行模型。它真正解决的不是“谁能用系统”,而是:
任务以什么身份执行、消耗哪一类资源、以及如何避免相互影响
理解这一点,才能看懂 DolphinScheduler 多租户设计的本质。
单租户与多租户是什么?
首先,我们先来搞清楚单租户和多租户是什么。
在企业级调度平台中,不同团队或业务线如何共享平台资源,是设计系统时必须考虑的核心问题。单租户和多租户是两种常见模式,它们在资源隔离、稳定性和扩展性上有明显差异。理解这些差异,有助于企业选择合适的架构,实现高效、可控的调度管理。
单租户指整个平台仅服务一个团队或业务线,所有任务共用同一执行环境、资源池和权限体系。多租户则允许同一平台服务多个团队,每个团队在逻辑上被隔离为独立 Tenant,并映射到底层执行身份(Linux 用户)、资源队列(YARN Queue)或云原生命名空间(Kubernetes Namespace),实现任务和资源的独立管理。
相比单租户,多租户在资源隔离、稳定性和扩展性方面有显著优势。单租户虽然部署和管理简单,但随着团队和任务增多,资源争抢和任务互相干扰的问题会逐渐显现。多租户通过明确的 Tenant 隔离,不仅让任务互不影响,还支持按团队或环境划分资源池,实现企业级平台的高可控性和可扩展性。

多租户的核心机制:
以Tenant为中心的执行模型
考虑到单租户的局限性,Apache DolphinScheduler 采用的是多租户的设计。
可以说,Apache DolphinScheduler 的所有隔离能力,最终都收敛到一个核心对象:Tenant(租户)。
但 Tenant 并不是一个简单的逻辑标签,而是一个“执行上下文容器”。当一个任务被调度执行时,系统会基于 Tenant 决定三件关键事情:
首先是执行身份。任务在 Worker 节点上并不是“抽象执行”,而是必须以某个操作系统用户运行。Tenant 会绑定一个 Linux 用户,任务最终以该用户身份执行,从而天然继承文件权限与系统隔离能力。
示例:Linux 用户执行任务
# 切换到 Tenant 对应 Linux 用户sudo su - team_alpha_user# 执行工作流任务spark-submit --class com.example.Job /opt/jobs/job.jar
其次是资源归属。当任务提交到计算引擎时(如 Spark、Flink),必须进入某个资源池。Tenant 会绑定具体的资源队列或命名空间,确保任务不会无限制争抢集群资源。
示例:创建 Tenant 并绑定 YARN Queue
curl -X POST http://dolphinscheduler-api:12345/tenants \-H "Content-Type: application/json" \-d '{"name": "team_alpha","queue": "team_alpha_queue","description": "Team Alpha Tenant"}'
最后是隔离边界。无论是数据访问、任务运行还是资源使用,Tenant 都构成了一条清晰的边界,使不同团队之间形成“逻辑隔离”。
这三点共同构成了 DolphinScheduler 多租户的底层运行机制。
资源隔离是如何实现的
如果只停留在调度层,多租户是无法真正隔离资源的。DolphinScheduler 的关键设计在于,它把 Tenant 映射到了底层真实资源体系中。
在传统大数据架构中,这种映射主要体现在 Apache Hadoop YARN 上。每一个 Tenant 通常会绑定一个独立的 Queue。任务在提交时,会携带该队列信息进入资源调度系统。YARN 会基于队列配置(容量、权重、最大资源)进行调度,从而保证不同租户之间不会互相挤占资源。
YARN 映射示例:
Queue 配置<queue name="team_alpha_queue"><capacity>30</capacity><maximum-capacity>50</maximum-capacity><user-limit-factor>1.0</user-limit-factor></queue>
在这种机制下,即使某个团队突然提交大量任务,也只会消耗自己队列中的资源,而不会影响其他业务。
在云原生环境中,这一机制对应到 Kubernetes。每个 Tenant 通常映射为一个 Namespace,任务以 Pod 形式运行。通过 ResourceQuota,可以限制 Namespace 的总资源上限;通过 LimitRange,可以控制单个任务的资源使用。这种方式不仅隔离资源,还进一步隔离了网络和运行环境。
Kubernetes 映射示例:
Namespace + ResourceQuota
apiVersion: v1kind: Namespacemetadata:name: team-alpha---apiVersion: v1kind: ResourceQuotametadata:name: team-alpha-quotanamespace: team-alphaspec:hard:cpu: "20"memory: "64Gi"pods: "50"
而在执行层,Linux 用户提供了最后一道隔离。即使在同一台机器上,不同 Tenant 的任务也无法访问彼此的数据目录或脚本,从而避免越权操作。
调度到资源的完整链路
把这些机制串起来,可以看到一条完整的执行路径:

一个工作流在 DolphinScheduler 中被触发之后,首先会确定所属 Tenant。随后,Master 将任务分发到 Worker,在执行时切换到对应的 Linux 用户。任务提交到计算引擎时,会自动带上 Tenant 绑定的资源信息(如 YARN Queue 或 Kubernetes Namespace)。最终,任务在指定资源池中运行,并受到资源配额的限制。
这条链路实现了从“调度逻辑”到“资源执行”的全流程隔离。
技术架构
下面这张图展示了 DolphinScheduler 多租户与资源隔离的整体架构关系(可以直接用于文章或分享):

图中可以清晰看到三层结构:
这也是整个多租户机制的核心:调度层不直接管理资源,而是通过 Tenant 映射控制资源使用
为什么这种设计在企业中有效
这种多租户设计的价值,在企业环境中会被迅速放大。
当多个团队共享平台时,资源争抢几乎是必然的。如果没有 Tenant + Queue / Namespace 的绑定机制,任何一个高并发任务都可能拖慢整个系统。而通过这种分层隔离,每个团队都被限制在自己的资源边界内。
同时,这种设计也让问题定位变得更简单。当某个任务异常时,可以快速定位到具体 Tenant,再进一步定位到对应资源池,而不会影响全局。
更重要的是,它具备良好的扩展性。无论是增加新团队,还是引入新的计算引擎,都可以通过扩展 Tenant 映射来实现,而不需要重构调度系统本身。
总结一下
DolphinScheduler 的多租户设计,本质上是一种“把调度系统嵌入资源体系”的方法。它不是通过复杂逻辑来隔离,而是借助操作系统、资源调度框架和容器平台,构建出一套稳定、清晰、可控的执行模型。
对于工程师来说,真正需要关注的不是“如何创建 Tenant”,而是:
如何让 Tenant 与资源体系形成合理映射,从而实现真正的隔离与稳定性
这,才是多租户设计的核心价值。
前文回顾:
第 1 篇 | 调度系统,不只是一个“定时器”
第 2 篇|Apache DolphinScheduler 的核心抽象模型
第 3 篇|调度是如何“跑起来”的?
第 4 篇|状态机:调度系统真正的灵魂
第 5 篇 | 任务失败怎么办?一文讲透 Apache DolphinScheduler 的重试与补数机制
下篇预告:
第 7 篇|调度平台的性能瓶颈在哪里?
END

用户案例

迁移实战

最新发版消息

加入社区
关注社区的方式有很多:
同样地,参与Apache DolphinScheduler 有非常多的参与贡献的方式,主要分为代码方式和非代码方式两种。
非代码方式包括:
完善文档、翻译文档;翻译技术性、实践性文章;投稿实践性、原理性文章;成为布道师;社区管理、答疑;会议分享;测试反馈;用户反馈等。
代码方式包括:
查找Bug;编写修复代码;开发新功能;提交代码贡献;参与代码审查等。


你的好友秀秀子拍了拍你
并请你帮她点一下“分享”
