写点什么

利用 Amazon Batch 来为容器化负载调用海量云端算力

  • 2022 年 1 月 14 日
  • 本文字数:3643 字

    阅读完需:约 12 分钟

利用 Amazon Batch 来为容器化负载调用海量云端算力

前言


Apache Airflow(以下简称为 Airflow) 是一项由 Airbnb 在 2014 年推出的开源项目,其目的是为了管理日益复杂的数据管理工具、脚本和分析工具,提供一个构建批处理工作流的方案。Airflow 是一种可扩展的分布式工作流调度系统,允许将工作流建模为有向无环图(DAGs),通过这种方式简化数据管道中各个处理步骤的创建、编排和监控。Airflow 被广泛应用于机器学习、数据分析/处理以及各类需要流程化的场景。


在 2020 年初的时候,有一篇 blog 剖析了 Airflow 架构,并给出了在亚马逊云科技上部署 Airflow 的建议。也正因为 Airflow 在机器学习,数据分析等领域用户众多,为了满足这部分用户的需要,亚马逊云科技在 2020 年 11 底推出了托管的 Apache Airflow 服务 Amazon Managed Workflows for Apache airflow (以下简称为 Amazon MWAA)。

  • https://aws.amazon.com/cn/blogs/china/deploy-apache-airflow-to-the-cloud/


目前 Amazon MWAA 已经在亚马逊云科技全球大部分区域可用,如果要在尚未发布的区域使用 Airflow,或者有定制化部署 Airflow 的需求,可以使用自建部署的方式。然而,部署 Airflow 并不是一件简单的事情,如何做好高可用,易扩展,如何保障安全,以及减少运维难度等有很多细节。本文以在亚马逊云科技中国区部署自建 Airflow 为例,提出了一个参考架构,并提供了一套 Amazon CDK 的参考实现,让使用 Amazon CDK 的用户通过数行代码就可以将整套方案部署到云上。


架构考量


Airflow 体系架构概述


如下图所示,Airflow 主要组成部分为:


  • Webserver:为用户提供界面用来管理,调度编排任务;

  • Scheduler:处理触发预定的工作流,并将任务提交给执行器运行;

  • Worker:负责处理运行任务;

  • DAG Directory: 用来存放用户定义的 DAG 文件;

  • Metadata Database: 用来存储集群的元数据;

用户将 DAG 文件上传到 DAG Directory,登陆到 Webserver,可以管理,调度编排任务。用户的操作被写入 Metadata Database,Metadata Database 记录着 DAG 中的任务以及后台对应的状态,Scheduler 从 Metadata Database 读取数据,检查每个任务的状态,并将任务调度给 Worker,Worker 执行任务,更新 Metadata Database 中的状态信息。


Airflow On Amazon Web Services 架构概述


Airflow 在亚马逊云科技上进行部署时:


  • Webserver/Scheduler/Worker 三个组件,可以部署到 Amazon Fargate 上,充分利用无服务器架构的优势,减少维护工作量;

  • DAT Directory 使用 Amazon S3,用户将 DAG 文件上传到 Amazon S3,webserver/scheduler 将 DAG 文件同步到集群;

  • Metadata Database 使用托管的数据库服务 Amazon RDS,提高可用率,减少维护工作量。


整体架构图如下所示:


如下为详细的设计考量:


网络层


  • 使用三层经典架构;

  • Airflow Fargate 集群位于 Private subnet,Airflow 访问 Amazon Public ECR Repository 通过 Amazon NAT Gateway–> Amazon Internet Gateway 访问,访问 Amazon ECS Control Plane,Amazon CloudWatch,Amazon SecretsManager 则通过 Amazon Interface Endpoint 走内网,访问 Amazon S3 通过 Amazon Gateway Endpoint 走内网;

  • Amazon ElasticCache 和 Amazon RDS 位于 Private Subnet,通过 Amazon Security Group 的限制,只对 Amazon Fargate 集群开放。

存储层


  • 数据库选择使用 Amazon RDS for Postressql,保证服务高可用,降低运维工作量;

  • 内存数据库选择使用 Amazon Elastic for Redis,作为缓存;

  • DAG Directory 使用 Amazon S3,利用 Amazon S3 的持久性和便利性,用户将 DAG 文件上传到 Amazon S3,Amazon Fargate 定时同步 DAG 文件。


计算层


  • 计算层选择 Amazon ECS on Fargate,您无需预置和管理服务器,而且可以为 Airflow 的 Webserve/Scheduler/Worker 指定独立的资源,并通过设计隔离应用程序来提高安全性。Amazon Fargate 分配了适当的计算量,从而无需选择实例和扩展集群容量。


服务层


  • Airflow 的 Scheduler 和 Worker 的运行依赖于 Webserver,选择使用 Amazon CloudMap 来做服务注册和服务发现,维护不断变化的资源的更新位置,提高应用程序的可用性。


Airflow On Amazon Web Services 部署概述


基于如上方案,将 Airflow 部署到云上,大致需要如下步骤:


1. 创建 Amazon S3 Bucket,用于存放用户上传的 DAG 文件;

2. 创建 Amazon VPC,并确保:

  • Amazon VPC 跨最少两个可用区;

  • Amazon VPC 打开 enableDNSHostNames 功能;

  • Amazon VPC 打开 enableDNSSupport 功能;

3. 创建 Amazon Security Group,具体包括:

  • Amazon VPC Endpoint Security Group

  • Amazon Airflow ECS Service Security Group

  • Amazon Database Security Group

  • Amazon Redis Security Group

  • Amazon ELB Security Group

4. 创建 Amazon VPC Endpoint,具体包括:

  • Amazon S3 Gateway Endpoint

  • Amazon ECS/ECR/CloudWatch/SecretsManager Interface Endpoint

5. 创建 Amazon RDS 数据库

6. 在 Amazon Secrets Manager 中生成 Amazon Database Credentials,并应用于 Amazon RDS 数据库;

7. 创建 Amazon Redis 集群;

8. 创建 Amazon CloudWatch LogGroup;

9. 创建 Amazon ECS 集群;

10. 创建并配置 Amazon Cloud Map;

11. 创建 Amazon Cloud MapLoad Balancer, Amazon Cloud Map TargetGroup, Amazon Airflow Webserver ECS Task Definition, Amazon Airflow Webserver ECS Service;

12. 创建 Amazon Airflow Scheduler ECS Task Definition, Amazon Airflow Scheduler ECS Service;

13. 创建 Amazon Airflow Worker ECS Task Definition, Amazon Airflow Worker ECS Service;


可以看出,在云上部署高可用,易扩展的 Aiflow 集群并不是一简单的事情。


因此,这里利用 Amazon CDK,将上述工作封装成了一 L2 的 Construct Library,用户使用 Amazon CDK 只需要简单的数行代码即可在云上完成上述工作。

  • Amazon Construct Library

https://github.com/readybuilderone/serverless-airflow


基于 Amazon CDK 部署 Airflow


Amazon CDK 开发环境搭建


开发 Amazon 需要先安装 Amazon CDK CLI,利用 Amazon CDK CLI 可以生成对应的 Amazon CDK 的 Project。


Amazon CDK CLI 的安装依赖于 node.js,所以在您的开发环境需要先安装 node.js。node.js 的安装可参看官方教程: https://nodejs.org/en/download/package-manager/


安装好 node.js 之后,可以直接使用如下命令安装 Amazon CDK CLI:


  • npm install -g aws-cdk #安装 cdk cli

  • cdk –version #查看版本


使用 Amazon CDK 创建 Apache Airflow


安装 Amazon CDK CLI 后,在您的环境中通过命令 Amazon configure 命令配置好对应的权限之后,就可以使用 Amazon CDK 来进行开发了。


Amazon CDK 支持 JavaScript、TypeScript、Python、Java、C# 和 Go 等开发语言,这里以 TypeScript 为例。


在命令行中运行如下命令,创建 Amazon CDK Project:


  • mkdir apache-airflow-cdk && cd apache-airflow-cdk

  • cdk init sample-app –language=typescript


在 IDE(这里以 VSCode 为例)打开文件夹,如下图所示:


在 lib 文件夹下的 apache-airflow-cdk-stack.ts 定义了 Amazon CloudFormation 对应的结构,可以看出,默认的 Sample 中创建了一个 Amazon SQS 的 Queue,和一个 SNS 的 Topic。


删除掉 Sample 代码,修改代码为如下,创建 Airflow 集群:

import * as cdk from '@aws-cdk/core';import * as airflow from 'cdk-serverless-airflow';
export class ApacheAirflowCdkStack extends cdk.Stack {  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {    super(scope, id, props);
    new airflow.Airflow(this, 'Airflow');
  }}
复制代码



在命令行中,执行如下代码,安装 cdk-serverless-airflow 包。

npm i cdk-serverless-airflow
复制代码



之后,在命令行中执行如下命令并确认,开始在云上部署 Airflow 集群:

cdk deploy
复制代码



集群的创建大约需要 10 分钟,在集群创建完成之后, 会输出作为 DAG Directory 的 Amazon S3 Bucket 的名字和 Airflow 的访问地址:


在浏览器中访问 Airflow 地址,使用默认的用户名/密码(user/bitnami)登陆之后,进入如下页面:


在 DAG Directory 的 Bucket 中创建 airflow_dags 文件夹,并上传 DAG 文件到这个文件夹:


等待约一分钟,刷新 Airflow 控制台,可以看到对应的 DAG 已经加载成功:


总结


在这篇文章中,提供了使用 Amazon CDK 的方式来部署 Airflow,可以看出使用 Amazon CDK,只需要简单的数行代码,即可完成部署。cdk-serverless-airflow 的代码各位可以自由查看,修改,这里的实现只做参考。

  • cdk-serverless-airflow

    https://github.com/readybuilderone/serverless-airflow


参考资料


  • 亚马逊云科技 Blog: 将 Apache Airflow 部署到云端

    https://aws.amazon.com/cn/blogs/china/deploy-apache-airflow-to-the-cloud/

  • 亚马逊云科技 Blog: Setting up Amazon PrivateLink for Amazon ECS, and Amazon ECR

    https://aws.amazon.com/cn/blogs/compute/setting-up-aws-privatelink-for-amazon-ecs-and-amazon-ecr/

  • Getting started with the Amazon CDK

    https://github.com/aws/aws-cdk

本篇作者


韩医徽

亚马逊云科技解决方案架构师工程师

负责亚马逊云科技合作伙伴生态系统的云计算方案架构咨询和设计,同时致力于亚马逊云科技在国内的应用和推广平台相关的开发工作。



用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
利用 Amazon Batch 来为容器化负载调用海量云端算力