亚马逊AWS官方博客
Cisco 使用 Apache DolphinScheduler 在 AWS 构建大数据系统实践
1. 背景介绍
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度开源系统,旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 Data OPS 编排中的关系。 解决数据研发 ETL 依赖错综复杂,无法监控任务健康状态的问题。DolphinScheduler 以 DAG(Directed Acyclic Graph,DAG)流式方式组装任务,可以及时监控任务的执行状态,支持重试、指定节点恢复失败、暂停、恢复、终止任务等操作。
在 Cisco 的数据团队构建数据业务时,选取并使用 Apache DolphinScheduler 进行搭建大数据调度平台已经有近三年时间。其中大部分的数据任务都需要提交部署到 AWS 平台上,在团队进行系统架构和开发期间经历了一系列的挑战。从最初的 2.0.3 版本开始至今,团队与社区一同成长。本文将分享 Cisco 数据团队如何基于 DolphinScheduler 3.1.1 版本进行二次开发,并与 AWS 云上的资源特性进行深度融合,增加了一些社区版本中未包含的新功能以实现业务需求的技术细节。
2. 整体架构说明
2.1 业务挑战与应对
- 调度平台支持了简易的 ETL 任务定义,方便业务人员快速构建任务;
- 需要分别支持 Apache Spark、Apache Flink 、ETL 任务提交到 EKS(Amazon Elastic Kubernetes Service)上运行;
- 需要解决跨多个 AWS 区域进行任务调度管理,支持多计算集群架构;
- 可以有效并安全的管理 AWS 相关资源的启、停和权限控制,并做到资源隔离;
- 兼容 AWS 服务密钥自动轮转策略,增强系统安全性。
2.2 整体部署架构
![]() |
- DolphinScheduler 的所有服务均部署在 Webex DC上,包括 API 、Alert 以及 Zookeeper、Master 和 worker 等组件;
- 支持提交 Spark、Flink 、ETL 任务到 EKS 运行;
- 支持一个调度服务负责多个 AWS 区域的计算任务调度管理,满足多国数据合规;
- 使用 Terraform 自动化 AWS 资源的配置和管理过程,简化资源分配和权限设定。
3. 技术实现细节
3.1 资源依赖和存储管理
Jar 包和配置文件等存储,选用 Amazon S3 Bucket 作为资源存储中心,存储用户的 Jar 包和可能的依赖配置文件。由于不同的业务通常在 AWS 上资源分布在不同存储桶,并且不同业务的都有数据隔离需求,这里需要支持多个 S3 Bucket 来满足不同集群的存储需求。因此,团队改进了 Dolphinscheduler 存储管理中对于 S3 的支持,使其兼容不同存储桶,并做了如下调整。
- 集群与 Bucket 的对应:每个集群将访问其对应的 S3 Bucket,以确保数据的局部性和合规性。
- 修改策略:我们需要调整我们的存储访问策略,以支持从多个 S3 Bucket 读写数据,不同的业务方要访问自己对应的 S3 bucket。
![]() |
3.2 Docker 镜像管理
在改造之前,几乎所有的 Docker 镜像都存储在 Cisco 的一个 Docker 仓库中。
这些镜像为运行的各种服务和任务提供了必要的运行环境和依赖。为了更好的与 AWS 服务结合,团队决定将 Docker image 放到 Amazon ECR (Amazon Elastic Container Registry)上。并且可以在调度平台统一查看管理。因此,也在 UI 中集成了预览 ECR 镜像功能,如图示。
![]() |
3.3 安全访问和权限管理
3.3.1 密钥管理工具迁移至 Secrets Manager
为了提高安全性,团队从 Cisco 的 Vault 服务迁移到了 AWS 的 Secrets Manager(ASM):
- ASM 提供了一个更加集成的解决方案来管理 AWS 资源的密码和密钥
- 使用 IAM Role 和 Service Account 的方式,以增强 Pod 的安全性
- 创建 IAM Role 和 Policy:首先创建一个 IAM Role,为其绑定必要的 Policy,确保只有必要的权限被授予
- 绑定 K8s Service Account:随后创建一个 Kubernetes Service Account,并将其与 IAM Role 关联
- Pod 的权限集成:在运行 Pod 时,通过关联到 Service Account,Pod 可以直接通过 IAM Role 获取所需的 AWS 凭证,从而访问必要的 AWS 资源
- 对 Apache DolphinScheduler 进行了扩展,以支持 AWS Secrets Manager,使得用户可以在不同的集群类型中选择密钥
![]() |
这些调整不仅提升了系统的可扩展性和灵活性,还加强了整体的安全架构,确保在 AWS 环境中的运行既高效又安全。同时也避免了之前密钥自动过期需要重启的问题。
3.3.2 AWS 资源的管理和权限申请
团队通过 Auth 系统和其他工具,管理 AWS 资源的权限和访问控制,使得资源分配更加灵活和安全。做到了下述内容支持:
- 多 AWS Account 支持:在 Auth 系统中可以管理多个 AWS 账户,并绑定不同的 AWS 资源如 S3 Bucket、ECR 和 ASM 等
- 资源映射和权限申请:用户可以在系统中对已有的 AWS 资源进行映射和权限申请,这样在运行 job 时可以轻松地选择需要访问的资源
![]() |
- Service Account 唯一区分:通过特定的集群、namespace 和项目名称绑定 Service Account,确保其唯一性
- 权限绑定界面:用户可以在界面上将 Service Account 绑定到具体的 AWS 资源,如 S3、ASM 或 ECR,从而实现权限的精确控制
![]() |
![]() |
3.4 自动化云上资源管理
3.4.1 动态资源配置和初始化服务(Init Container)
为了更灵活地管理和初始化 AWS 资源,团队实施了一个名为 Init Container 的服务。实现了下述内容:
- 资源拉取:Init Container 在 Pod 执行前,会自动拉取用户配置的 S3 资源,并将其放置到指定目录下
- 密钥和配置管理:根据配置,Init Container 会检查并拉取 ASM 中的密码信息,随后将其存放在文件中,并通过环境变量映射,供 Pod 使用
![]() |
3.4.2 Terraform 在资源创建和管理中的应用
通过 Terraform 自动化了 AWS 资源的配置和管理过程,简化了资源分配和权限设定。
- 资源自动化配置:使用 Terraform 创建所需的 AWS 资源,如 S3 Bucket 和 ECR Repo
- IAM 策略和角色管理:自动创建 IAM 策略和角色,确保每个业务单元可以按需访问其所需的资源
![]() |
4. 总结与展望
本文介绍了在 Cisco 数据团队在 AWS 平台上二次开发 DolphinScheduler 来应对企业内部对于数据调度任务的需求,未来还有一些地方可以优化改进可以提升用户提交和方便运维:
- 镜像推送优化:考虑跳过 Cisco 的中转打包流程,直接将包推送至 ECR,尤其是针对特定于 EKS 的镜像修改
- 一键同步功能:我们计划开发一键同步功能,允许用户将一个上传到 S3 Bucket 的资源包,勾选自动同步到其他 S3 Bucket,减少重复上传的工作
- 自动映射至 Auth 系统:AWS 资源通过 Terraform 创建后,系统将自动将这些资源映射到权限管理系统中,避免用户手动进行资源录入
- 权限控制优化:通过自动化的资源和权限管理,用户的操作变得更加简洁,减少了设置和管理的复杂性
通过这些改进,期望能够帮助用户使用 Apache DolphinScheduler 更有效地部署和管理作业,无论是在本地数据中心还是在 EKS 上,同时提高资源管理的效率和安全性。
参考链接
Dolphinschduler 架构设计:https://DolphinScheduler.apache.org/zh-cn/docs/3.1.2/architecture/design
EKS 部署 Dolphinscheduler 指南:https://aws.amazon.com/cn/blogs/china/aws-deployment-serverless-dolphinscheduler/
AWS 的策略和权限管控 IAM :https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html
Dolphinscheduler 社区分享: https://mp.weixin.qq.com/s/Md5C84kZLA_H4pdfzLmxbw