如何使用Apache Airflow来安排和管理工作流

1,574 阅读6分钟

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

image-47

正确的DAG,没有循环

image-48

有循环的不正确的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_idstart_date ,和schedule_interval

schedule_interval 被配置为@hourly,表示DAG将每小时运行一次。

DAG中的任务是在日志中打印一条信息。我们在这里使用了PythonOperator。这个操作符被用来执行任何可调用的Python函数。

一旦执行完成,我们应该在日志中看到 "第一个DAG成功执行 "的消息。我们将在GCP Cloud Composer上执行我们所有的DAGs。

image-49

Airflow用户界面

执行成功后,该信息会被打印在日志上。

image-50

日志

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,然后点击 "创建环境",如下图所示:

image-51

创建环境

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

image-54

一旦我们选择了我们需要的合成器类型,我们就需要做一些基本配置,就像在任何GCP管理的服务中一样("实例名称"、"位置 "等)。

这里的节点数应该始终是3,因为GCP将设置Airflow所需的3个服务。

image-56

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

image-57

Airflow实例

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

image-58

Kubernetes引擎

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

image-59

用于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并打印头部元素。在日志中,它看起来像这样:

image-60

DataFrame Head

在第二个任务中,GCSToGCSOperator,我们使用了move_object=True属性,这将从Source桶中删除文件。

一旦我们把文件上传到桶中,我们可以看到DAG正在被调度。这个DAG的名字是 "pipeline_demo"。

image-61

DAGs

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

image-62

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

image-63

更新缺失软件包的环境

要打开Airflow用户界面,点击Airflow webserver下的 "Airflow "链接。

image-64

Airflow实例,点击Airflow链接来打开用户界面

Airflow的用户界面看起来像这样。

image-65

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

image-66

为了在任务失败时发送电子邮件,你可以像这样使用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的工作。