Apache Airflow是一个开源的工作流程管理系统,它使编写、安排和监控工作流程变得容易。
一个工作流程作为一个操作序列,从开始到结束。Airflow中的工作流是使用标准的Python编程编写的有向无环图(DAG)。
你可以配置一个DAG何时开始执行,何时结束。你也可以通过非常直观的Airflow用户界面设置工作流监控。
你可以在短时间内启动并运行Airflow--它很容易使用,你只需要一些基本的Python知识。它也是完全开源的。
Apache Airflow还有一个有用的操作符集合,可以很容易地与谷歌云、Azure和AWS平台一起工作。
在这篇文章中,我们将介绍
- 什么是定向无环图(DAG)?
- 什么是运算符?
- 如何创建你的第一个DAG
- DAG的用例
- 如何设置云计算合成器
- 如何在Composer上运行流水线
什么是有向无环图,或DAG?
DAG,或称有向无环图,有节点和边。DAG不应该包含任何循环,其边应该始终是有方向的。
简而言之,DAG是一个数据管道,DAG中的每个节点是一个任务。一些节点的例子是将文件从GCS(谷歌云存储)下载到本地,使用Pandas在文件上应用业务逻辑,查询数据库,进行休息调用,或再次将文件上传到GCS桶。
视觉化的DAGs

正确的DAG,没有循环

有循环的不正确的DAG
你可以在Airflow中使用schedule_interval属性来安排DAGs。默认情况下,它是 "无",这意味着该DAG只能使用Airflow用户界面运行。
你可以使用cron预设选项(@hour、@daily、@weekly、@hourly、@monthly、@yearly)来安排DAG每小时、每天、每周、每月、每年或任何你想运行的。
如果你需要每5分钟、每10分钟、每天14:00运行DAG,或者在某个特定的日子里运行一次,比如每周四上午10:00,那么你应该使用这些基于cron的表达方式。
*/5 * * * * = 每5分钟一次
0 14 * * * = 每天14:00
什么是操作符?
一个DAG由多个任务组成。你可以使用操作符在DAG中创建任务,操作符是图中的节点。
在Airflow中,有各种现成的操作符可用,例如:
- LocalFilesystemToGCSOperator - 使用它将文件从本地上传到GCS桶。
- PythonOperator - 使用它来执行Python可调用程序。
- functionEmailOperator - 用它来发送电子邮件。
- SimpleHTTPOperator - 用它来做一个HTTP请求。
如何创建你的第一个DAG
我们要创建的例子DAG只包括一个操作符(Python操作符),它执行一个Python函数。
from airflow import DAG
from datetime import datetime
from airflow.operators.python_operator import PythonOperator
def message():
print("First DAG executed Successfully!!")
with DAG(dag_id="FirstDAG", start_date=datetime(2022,1,23), schedule_interval="@hourly",
catchup=False) as dag:
task = PythonOperator(
task_id="task",
python_callable=message)
task
第一步是导入DAG开发所需的必要模块。行with DAG ,这就是DAG,它是一个数据管道,有基本的参数,如dag_id ,start_date ,和schedule_interval 。
schedule_interval 被配置为@hourly,表示DAG将每小时运行一次。
DAG中的任务是在日志中打印一条信息。我们在这里使用了PythonOperator。这个操作符被用来执行任何可调用的Python函数。
一旦执行完成,我们应该在日志中看到 "第一个DAG成功执行 "的消息。我们将在GCP Cloud Composer上执行我们所有的DAGs。

Airflow用户界面
执行成功后,该信息会被打印在日志上。

日志
DAGs的用例
我们在这篇文章中要介绍的用例包括三个步骤。
在第一步中,我们将在某个输入GCS桶中上传一个.csv文件。这个文件应该由DAG中的PythonOperator来处理。将由PythonOperator执行的函数由Pandas代码组成,它代表了用户如何使用Pandas代码来转换Airflow数据管道中的数据。
在第二步,我们将把转换后的.csv文件上传到另一个GCS桶。这项任务将由GCSToGCSOperator来处理。
第三步是发送状态邮件,表明管道的执行已经完成,这将由EmailOperator处理。
在这个用例中,我们还将介绍如何在执行的任何步骤失败时通过电子邮件通知团队。
如何安装Cloud Composer
在GCP中,Cloud Composer是一个建立在Apache Airflow上的管理服务。Cloud Composer默认与其他GCP服务集成,如GCS、BigQuery、Cloud Dataflow等。
首先,我们需要创建Cloud Composer环境。因此,在搜索栏中搜索Cloud Composer,然后点击 "创建环境",如下图所示:

创建环境
在环境选项中,我选择了 "Composer 1 "选项,因为我们不需要自动扩展。

一旦我们选择了我们需要的合成器类型,我们就需要做一些基本配置,就像在任何GCP管理的服务中一样("实例名称"、"位置 "等)。
这里的节点数应该始终是3,因为GCP将设置Airflow所需的3个服务。

一旦我们完成了这些,它将为我们建立一个Airflow实例。要上传一个DAG,我们需要打开 "DAGs文件夹 "部分中显示的DAGs文件夹。

Airflow实例
如果你进入GCP上的 "Kubernetes引擎 "部分,我们可以看到有3个服务正在运行。

Kubernetes引擎
所有的DAG将驻留在Airflow创建的桶中。

用于DAG的Airflow Instance桶
如何在Composer上创建和运行管道
在管道中,我们有两个桶。input_csv将包含需要转换的csv,而transformed_csv桶将是转换完成后上传文件的位置。
整个流水线的代码如下:
from airflow import DAG
from datetime import datetime
import pandas as pd
from airflow.utils.email import send_email
from airflow.operators.python_operator import PythonOperator
from airflow.operators.email_operator import EmailOperator
from airflow.providers.google.cloud.transfers.gcs_to_gcs import GCSToGCSOperator
def transformation():
trainDetailsDF = pd.read_csv('gs://input_csv/Event_File_03_16_2022.csv')
print(trainDetailsDF.head())
with DAG(
dag_id="pipeline_demo",
schedule_interval="@hourly",
start_date=datetime(2022, 1, 23),
catchup=False
) as dag:
buisness_logic_task = PythonOperator(
task_id='ApplyBusinessLogic',
python_callable=transformation,
dag=dag)
upload_task = GCSToGCSOperator(
task_id='upload_task',
source_bucket='input_csv',
destination_bucket='transformed_csv',
source_object='Event_File_03_16_2022.csv',
move_object=True,
dag=dag
)
email_task = EmailOperator(
task_id="SendStatusEmail",
depends_on_past=True,
to='youremail',
subject='Pipeline Status!',
html_content='<p>Hi Everyone, Process completed Successfully! <p>',
dag=dag)
buisness_logic_task >> upload_task >> email_task
在第一个任务中,我们所做的就是从输入文件中创建一个DataFrame并打印头部元素。在日志中,它看起来像这样:

DataFrame Head
在第二个任务中,GCSToGCSOperator,我们使用了move_object=True属性,这将从Source桶中删除文件。
一旦我们把文件上传到桶中,我们可以看到DAG正在被调度。这个DAG的名字是 "pipeline_demo"。

DAGs
注意,万一你在上传或执行DAG后遇到任何 "导入错误",类似这样的情况。

你可以通过GCP中的 "PYPI Packages "选项上传这些缺失的软件包。这将在几分钟后更新环境。

更新缺失软件包的环境
要打开Airflow用户界面,点击Airflow webserver下的 "Airflow "链接。

Airflow实例,点击Airflow链接来打开用户界面
Airflow的用户界面看起来像这样。

成功执行Pipeline后,你应该看到以下内容。

为了在任务失败时发送电子邮件,你可以像这样使用on_failure_callback。
def notify_email(contextDict, **kwargs):
title = "Airflow alert: {task_name} Failed".format(**contextDict)
body = """
Task Name :{task_name} Failed.<br>
""".format(**contextDict)
send_email('youremail’, title, body)
buisness_logic_task = PythonOperator(
task_id='ApplyBusinessLogic',
python_callable=transformation,
on_failure_callback=notify_email,
dag=dag)
我们正在通过Sendgrid在composer上进行通知邮件的配置。另外,一旦你完成了Cloud Composer,别忘了删除这个实例,因为它不能被停止。
总结
Apache Airflow是一个相当容易使用的工具。现在互联网上也有很多帮助,社区也在不断壮大。
GCP通过为Airflow创建一个单独的管理服务,大大简化了Airflow的工作。