Apache Airflow 快速入门教程

Apache Airflow已经成为Python生态系统中管道编排的事实上的库。与类似的解决方案相反,由于它的简单性和可扩展性,它已经获得了普及。在本文中,我将尝试概述它的主要概念,并让您清楚地了解何时以及如何使用它。

Airflow应用场景

想象一下,你想要构建一个机器学习管道,它由以下几个步骤组成:

  • 从基于云的存储中读取图像数据集
  • 处理图像
  • 使用下载的图像训练深度学习模型
  • 将训练好的模型上传到云端
  • 部署模型

你将如何安排和自动化这个工作流程?Cron作业是一个简单的解决方案,但它也带来了许多问题。最重要的是,它们不允许你有效地扩展。Airflow提供了轻松调度和扩展复杂数据流程编排的能力,另一方面,它还能够在故障后自动重新运行它们,管理它们的依赖关系,并使用日志和仪表板监视它们。

在构建上述数据流之前,让我们先了解Apache Airflow 的基本概念。

Airflow 简介

Apache Airflow 是一个开源的平台,用于编排、调度和监控工作流,工作流是由一系列任务(Tasks)组成的,这些任务可以是数据处理、数据分析、机器学习模型训练、文件传输等各种操作。因此,它是ETL和MLOps用例的理想解决方案。示例用例包括:

  • 从多个数据源提取数据,对其进行聚合、转换,并将其存储在数据仓库中。
  • 从数据中提取见解并将其显示在分析仪表板中
  • 训练、验证和部署机器学习模型

核心组件

在默认版本中安装Apache Airflow 时,你将看到四个不同的组件。

  • Webserver: Webserver是Airflow的用户界面(UI),它允许您在不需要CLI或API的情况下与之交互。从那里可以执行和监视管道,创建与外部系统的连接,检查它们的数据集等等。
  • 执行器:执行器是管道运行的机制。有许多不同类型的管道在本地运行,在单个机器中运行,或者以分布式方式运行。一些例子是LocalExecutor, SequentialExecutor, CeleryExecutor和KubernetesExecutor
  • 调度器:调度器负责在正确的时间执行不同的任务,重新运行管道,回填数据,确保任务完成等。
  • PostgreSQL:存储所有管道元数据的数据库。这通常是Postgres,但也支持其他SQL数据库。

安装Airflow最简单的方法是使用docker compose。你可以从这里下载官方的docker撰写文件:

$ curl -LfO 'https://airflow.apache.org/docs/apache-airflow/2.5.1/docker-compose.yaml'

在这里插入图片描述

基本概念

要学习Apache Airflow,必须熟悉它的主要概念,这些概念可能有点难理解,让我们试着揭开它们的神秘面纱。

DAGs

所有管道都定义为有向无环图(dag)。每次执行DAG时,都会创建一个单独的运行。每个DAG运行都是独立的,并且包含一个关于DAG执行阶段的状态。这意味着相同的dag可以并行执行多次。

要实例化DAG,可以使用DAG函数或与上下文管理器一起使用,如下所示:

from airflow import DAG
with DAG(
    "mlops",
    default_args={
        "retries": 1,
     },
    schedule=timedelta(days=1),
    start_date=datetime(2023, 1, 1)
) as dag:

# dag code goes here

上下文管理器接受一些关于DAG的全局变量和一些默认参数。默认参数被传递到所有任务中,并且可以在每个任务的基础上重写。完整的参数列表可以在官方文档中找到。

在本例中,我们定义DAG将从2023年1月1日开始,并且每天执行一次。retries参数确保在可能出现故障后重新运行一次。

task(任务)

DAG的每个节点表示一个Task,即一段单独的代码。每个任务可能有一些上游和下游依赖项。这些依赖关系表示任务如何相互关联以及它们应该以何种顺序执行。每当初始化一个新的DAG运行时,所有任务都初始化为Task实例。这意味着每个Task实例都是给定任务的特定运行。

在这里插入图片描述

operator(任务模板)

操作符可以被视为预定义任务的模板,因为它们封装了样板代码并抽象了它们的大部分逻辑。常见的操作符有BashOperator、PythonOperator、MySqlOperator、S3FileTransformOperator。我们看到,操作符可以定义遵循特定模式的任务。例如,MySqlOperator创建任务来执行SQL查询,而BashOperator执行bash脚本。

操作符在DAG上下文管理器中定义,如下所示。下面的代码创建了两个任务,一个执行bash命令,另一个执行MySQL查询。

with DAG(
	"tutorial"
) as dag:

    task1 = BashOperator(
        task_id="print_date",
        bash_command="date",
    )

    task2 = MySqlOperator(
        task_id="load_table",
        sql="/scripts/load_table.sql"
    )

任务依赖

为了形成DAG的结构,我们需要定义每个任务之间的依赖关系。一种方法是使用>>符号,如下所示:

task1 >> task2 >> task3
# 一个任务有多个依赖
task1 >> [task2, task3]
# 也可以使用set_downstream, set_upstream
t1.set_downstream([t2, t3])

xcom

xcom,或相互通信,负责任务之间的通信。xcom对象可以在任务之间推拉数据。更具体地说,它们将数据推入元数据数据库,其他任务可以从中提取数据。这就是为什么可以通过它们传递的数据量是有限的。但是,如果需要传输大数据,则可以使用合适的外部数据存储,例如对象存储或NoSQL数据库。

看看下面的代码。这两个任务使用ti参数(任务实例的缩写)通过xcom进行通信。train_model任务将model_path推入元数据数据库,元数据由deploy_model任务拉出。

dag = DAG(
    'mlops_dag',
)

def train_model(ti):
    model_path = train_and_save_model()
    ti.xcom_push(key='model_path', value=model_path)

def deploy_model(ti):
    model_path = ti.xcom_pull(key='model_path', task_ids='train_model')
    deploy_trained_model(model_path)

train_model_task = PythonOperator(
    task_id='train_model',
    python_callable=train_model,
    dag=dag
)

deploy_model_task = PythonOperator(
    task_id='deploy_model',
    python_callable=deploy_model,
    dag=dag
)

train_model_task >> deploy_model_task

Taskflow

Taskflow API是一种使用Python装饰器@task来定义任务的简单方法。如果所有任务的逻辑都可以用Python编写,那么一个简单的注释就可以定义一个新任务。Taskflow自动管理其他任务之间的依赖关系和通信。

使用Taskflow API,我们可以用@dag装饰器初始化DAG。下面是使用Tashflow示例:

@dag(
    start_date=datetime(2023, 1, 1),
    schedule_interval='@daily'
)
def mlops():

    @task
    def load_data():
        . . .
        return df

    @task
    def preprocessing(data):
       . . .
       return data

    @task
    def fit(data): 
        return None

    df = load_data()
    data = preprocessing(df)
    model = fit(data)
    
dag = mlops()

注意,任务之间的依赖关系是通过每个函数参数隐含的。这里我们是简单的连接顺序,但实际可以变得复杂得多。Taskflow API还解决了任务之间的通信问题,因此使用xcom的需求有限。

调度

作业调度是Airflow的核心功能之一。这可以使用schedule_interval参数完成,该参数接收cron表达式,表示日期时间对象,或预定义变量,如@hour, @daily等。更灵活的方法是使用最近添加的时间表,它支持使用Python定义自定义时间表。

下面是如何使用schedule_interval参数的示例。以下DAG将每天执行。

@dag(
    start_date=datetime(2023,1,1),
    schedule_interval = '@daily',
    catchup =False
)
def my_dag():
    pass

关于调度,需要了解两个非常重要的概念:回填(backfill)和追赶(catchup)。

一旦我们定义了DAG,我们就设置了开始日期和计划间隔。如果catchup=True,则Airflow 将为从开始日期到当前日期的所有计划间隔创建DAG运行。如果catchup=False,气流将只从当前日期调度运行。

回填扩展了这个想法,使我们能够在CLI中创建过去的运行,而不管catchup参数的值:

$ airflow backfill  -s <START_DATE> -e <END_DATE> <DAG_NAME>

连接

Airflow 提供了一种简单的方法来配置与外部系统或服务的连接。可以使用UI、作为环境变量或通过配置文件创建连接。它们通常需要URL、身份验证信息和唯一id。钩子(Hooks )是一种API,它抽象了与这些外部系统的通信。例如,我们可以通过如下的UI定义一个PostgreSQL连接:

在这里插入图片描述

然后使用PostgresHook来建立连接并执行我们的查询:

pg_hook = PostgresHook(postgres_conn_id='postgres_custom')

conn = pg_hook.get_conn()
cursor = conn.cursor()
cursor.execute('create table _mytable (ModelID int, ModelName varchar(255)')
cursor.close()
conn.close()

高级概念

为了使本教程尽可能完整,我需要提到一些更高级的概念。我不会详细介绍每一个,但我强烈建议你看看他们,如果你想深入掌握Airflow 。

  • 分支:分支允许你将任务划分为许多不同的任务,如:支持条件处理不同任务的工作流。最常见的方法是BranchPythonOperator。
  • 任务组:任务组可以在单个组中组织多个任务。它是简化图形视图和重复模式的好工具。
  • 动态包:包和任务也可以以动态的方式构造。从Airflow 2.3开始,可以在运行时创建包和任务,这对于并行和依赖输入的任务来说是理想的。气流也支持Jinja模板,并且是对动态包非常有用的补充。
  • 单元测试和日志记录:气流具有运行单元测试和记录信息的专用功能.

Airflow最佳实践

在我们看到实际操作的示例之前,让我们讨论一下大多数从业者使用的一些最佳实践。

  • 幂等性:dag和任务应该是幂等的。使用相同的输入重新执行相同的DAG运行应该始终具有与执行一次相同的效果。
  • 原子性:任务应该是原子性的。每个任务应该负责一个操作,并且独立于其他任务
  • 增量过滤:每个DAG运行应该只处理一批支持增量提取和加载的数据。这样,可能出现的故障就不会影响整个数据集。
  • 顶级代码:如果不是用于创建操作符或标记,则应避免使用顶级代码,因为它会影响性能和加载时间。所有代码都应该在任务内部,包括导入包、数据库访问和繁重的计算。
  • 复杂性:dag应尽可能保持简单,因为高复杂性可能会影响性能或调度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928176.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GEE Download Data——气温数据的下载

GEE数据下载第二弹!今天我们来分享气温数据的下载。 一、数据介绍 气温数据我们要用到的是MODIS数据产品,MOD11A2 V6.1 产品提供 1200 x 1200 公里网格内 8 天平均陆地表面温度 (LST)。 MOD11A2 中的每个像素值都是该 8 天内收集的所有相应 MOD11A1 LST 像素的简单平均值。…

分布式推理框架 xDit

1. xDiT 简介 xDiT 是一个为大规模多 GPU 集群上的 Diffusion Transformers&#xff08;DiTs&#xff09;设计的可扩展推理引擎。它提供了一套高效的并行方法和 GPU 内核加速技术&#xff0c;以满足实时推理需求。 1.1 DiT 和 LLM DiT&#xff08;Diffusion Transformers&am…

uniapp 自定义导航栏增加首页按钮,仿微信小程序操作胶囊

实现效果如图 抽成组件navbar.vue&#xff0c;放入分包 <template><view class"header-nav-box":style"{height:Props.imgShow?:statusBarHeightpx,background:Props.imgShow?:Props.bgColor||#ffffff;}"><!-- 是否使用图片背景 false…

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…

MacOS 命令行详解使用教程

本章讲述MacOs命令行详解的使用教程&#xff0c;感谢大家观看。 本人博客:如烟花般绚烂却又稍纵即逝的主页 MacOs命令行前言&#xff1a; 在 macOS 上,Terminal&#xff08;终端) 是一个功能强大的工具&#xff0c;它允许用户通过命令行直接与系统交互。本教程将详细介绍 macOS…

【计算机网络】实验6:IPV4地址的构造超网及IP数据报

实验 6&#xff1a;IPV4地址的构造超网及IP数据报 一、 实验目的 加深对IPV4地址的构造超网&#xff08;无分类编制&#xff09;的了解。 加深对IP数据包的发送和转发流程的了解。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、了解IPV4地址的构造超网…

Java Web 1HTML快速入门

目录 一、Web开发介绍 1.什么是Web&#xff1f; 2.初识Web前端 二、HTML快速入门 1.什么是HTML、CSS&#xff1f; 2、案例练习 3.小结 三、VS Code开发工具 四、基础标签&样式&#xff08;HTML&#xff09; 2、实现标题--样式1&#xff08;新闻标题的颜色&#xff0…

【流程图】各元素形状和含义

判定、文档、数据、数据库、流程处理节点 矩形 - 动词 平行四边形 - 图像 下波浪 - 数据 图片来源http://baike.cu12.com/bkss/62449.shtml

利用机器学习预测离婚:从数据分析到模型构建(含方案和源码)

背景介绍 在当今社会&#xff0c;婚姻关系的稳定性受到了多方面因素的影响&#xff0c;包括经济压力、沟通问题、个人价值观差异等。离婚不仅对夫妻双方产生深远的影响&#xff0c;还可能对子女的成长环境和社会稳定造成不利影响。因此&#xff0c;理解并预测可能导致离婚的因素…

分层架构 IM 系统之 Router 架构分析

通过前面文章的分析&#xff0c;我们已经明确&#xff0c;Router 的核心职责是作为中央存储记录在线客户端的连接状态&#xff0c;Router 在本质上是一个内存数据库。 内存是一种易失性的存储&#xff0c;既如此&#xff0c;Router 的可用性如何保障呢&#xff1f; 副本是分布…

二分查找常规实现

使用二分查找有一个前提条件&#xff1a;要查找的数必须在一个有序数组里。在这个前提下&#xff0c;取中间位置数作为比较对象&#xff1a; 若要查找的值和中间数相等&#xff0c;则查找成功。 若小于中间数&#xff0c;则在中间位置的左半区继续查找。 若大于中间数&#x…

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…

获取联通光猫的管理员密码

缘起&#xff1a;联通给免费更换了一个新的光猫&#xff0c;烽火的光路由&#xff0c;一个WAN口&#xff0c;4个LAN口&#xff0c;带USB接口&#xff0c;欣欣然接受。但是呢&#xff0c;发现以前的管理员密码CUAdmin不能用了。经过一系列查询&#xff0c;借助别人的经验&#x…

数组练习(非最终版)

作业1&#xff1a;使用二维数组输出杨辉三角 //杨辉三角 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int i,j,n;scanf("%d",&n);int arr[n][n];for(i0;i<n;i){arr[i][0]1;arr[…

【MySQL 进阶之路】索引概述

第06章_索引 1.什么是索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查…

微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution

3.3 Trigonometric Substitution - Calculus Volume 2 | OpenStax

业财一体化新篇章:外贸ERP软件重塑业务流程

业财一体化的定义&#xff08;Definition&#xff09; FMS&#xff0c;即财务管理软件&#xff08;Financial Management Software&#xff09;&#xff0c;涵盖了用于管理公司财务的多种工具和系统&#xff0c;包括预算管理、账务处理、报表生成等功能。 ERP&#xff0c;即企…

Qt 信号与槽:UI设计的基础

Qt 的信号与槽机制是其最强大的功能之一&#xff0c;也是初学者理解 Qt 的第一步。它让对象之间的通信变得直观和高效。信号与槽类似于现实生活中的“呼叫和应答”模式&#xff1a;一个对象发出信号&#xff0c;另一个对象响应并执行动作。 什么是信号与槽&#xff1f; 信号与…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下&#xff1a; QT C 两个QWideget A B现在有放在一个窗口QWideget Test内&#xff0c;初始比例要2&#xff1a;8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时&#xff0c;有条线&#xff0c;可以左右移动来控件 A B 窗口所占的大小widgetB &#xff08;有 wi…