亚马逊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://thinkwithwp.com/cn/blogs/china/aws-deployment-serverless-dolphinscheduler/
AWS 的策略和权限管控 IAM :https://docs.thinkwithwp.com/IAM/latest/UserGuide/access_policies.html
Dolphinscheduler 社区分享: https://mp.weixin.qq.com/s/Md5C84kZLA_H4pdfzLmxbw