前言
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/blo...
目前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部署到云上,大抵须要如下步骤:
- 创立Amazon S3 Bucket,用于寄存用户上传的DAG文件;
- 创立Amazon VPC,并确保:
- Amazon VPC 跨起码两个可用区;
- Amazon VPC 关上 enableDNSHostNames 性能;
- Amazon VPC 关上 enableDNSSupport性能;
- 创立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
- 创立Amazon VPC Endpoint,具体包含:
- Amazon S3 Gateway Endpoint
- Amazon ECS/ECR/CloudWatch/SecretsManager Interface Endpoint
- 创立Amazon RDS 数据库
- 在Amazon Secrets Manager中生成Amazon Database Credentials,并利用于Amazon RDS数据库;
- 创立Amazon Redis集群;
- 创立Amazon CloudWatch LogGroup;
- 创立Amazon ECS 集群;
- 创立并配置Amazon Cloud Map;
- 创立Amazon Cloud MapLoad Balancer, Amazon Cloud Map TargetGroup, Amazon Airflow Webserver ECS Task Definition, Amazon Airflow Webserver ECS Service;
- 创立Amazon Airflow Scheduler ECS Task Definition, Amazon Airflow Scheduler ECS Service;
- 创立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/readybuild...
基于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/downloa...。
装置好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/readybuild...
参考资料
- 亚马逊云科技Blog: 将Apache Airflow部署到云端
https://aws.amazon.com/cn/blo... - 亚马逊云科技Blog: Setting up Amazon PrivateLink for Amazon ECS, and Amazon ECR
https://aws.amazon.com/cn/blo... - Getting started with the Amazon CDK
https://github.com/aws/aws-cdk
本篇作者
韩医徽
亚马逊云科技解决方案架构师工程师
负责亚马逊云科技合作伙伴生态系统的云计算计划架构征询和设计,同时致力于亚马逊云科技在国内的利用和推广平台相干的开发工作。