airflow源码精读 四

Airflow Core

  • Airflow工作流的主要特征是所有工作流都在Python代码中定义。

The main characteristic of Airflow workflows is that all workflows are defined in Python code.

代码片段

from datetime import datetime

from airflow import DAG
from airflow.decorators import task
from airflow.operators.bash import BashOperator

# A DAG represents a workflow, a collection of tasks
with DAG(dag_id="demo", start_date=datetime(2022, 1, 1), schedule="0 0 * * *") as dag:

    # Tasks are represented as operators
    hello = BashOperator(task_id="hello", bash_command="echo hello")

    
    @task()
    def airflow():
        print("airflow")

    # Set dependencies between tasks
    # 两个任务task:运行Bash脚本的BashOperator,另一个是使用@task装饰器定义的Python函数
    hello >> airflow()
  • 两个任务task:

  • BashOperator:运行Bash脚本的BashOperator

  • _PythonDecoratedOperator:@task装饰器定义的Python函数, Python script

  • 任务之间的>>定义了依赖关系和控制任务将以何种顺序执行

Why not Airflow?

Airflow是为有限批处理工作流而建立的, 虽然CLI和REST API允许触发工作流,但Airflow不是基于事件的无限运行的工作流构建的。

  • Airflow不是流式解决方案。

Quick Start 快速开始

使用python3:3.7-10,pip通过指定的constraints-3.7.txt安装(有墙)

安装脚本

单机线性SequentialExecutor

# Airflow needs a home. `~/airflow` is the default, but you can put it
# somewhere else if you prefer (optional)
export AIRFLOW_HOME=~/airflow

# Install Airflow using the constraints file
AIRFLOW_VERSION=2.5.1
PYTHON_VERSION="$(python --version | cut -d " " -f 2 | cut -d "." -f 1-2)"
# For example: 3.7
CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"
# For example: https://raw.githubusercontent.com/apache/airflow/constraints-2.5.1/constraints-3.7.txt
pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"
# 约束依赖冲突
# The Standalone command will initialise the database, make a user,
# and start all components for you.
airflow standalone

# Visit localhost:8080 in the browser and use the admin account details
# shown on the terminal to login.
# Enable the example_bash_operator dag in the home page
  • 会在AIRFLOW_HOME下生成airflow.cfg

  • 通过web ui查看:Admin->Configuration

  • pid: $AIRFLOW_HOME/airflow-webserver.pid 或 /run/airflow/webserver.pid

  • SQLite:为了开箱即用,仅支持单机线性SequentialExecutor

Airflow 简介

Airflow 是基于分布式任务队列 Celery 基础上的定时调度系统,它将不同的任务类型抽象成 Operator,并提供 API 编排各任务之间的依赖关系和配置属性,形成 DAG,从而简化任务提交和维护成本。

同时 Airflow 还提供任务重跑、标记成功、查看日志等的可视化操作 UI 和更为灵活丰富的客户端命令行接口。另外可配置和可扩展的架构设计不仅支持单机单进程,还支持基于 Celery 和 Mesos 的分布式集群运行,任务的消息通知也可以在 Redis 和 RabbitMQ 等中自由选择,使得 Airflow 可以灵活扩展。

Airflow 工作原理

Airflow 是建立在元数据库上的队列系统。数据库存储队列任务的状态,调度器使用这些状态来确定如何将其它任务添加到队列的优先级。此功能由四个主要组件编排:

  1. 元数据库:这个数据库存储有关任务状态的信息。数据库使用在 SQLAlchemy 中实现的抽象层执行更新。该抽象层将 Airflow 剩余组件功能从数据库中干净地分离了出来。

  1. 调度器:调度器是一种使用 DAG 定义结合元数据中的任务状态来决定哪些任务需要被执行以及任务执行优先级的过程。调度器通常作为服务运行。

  1. 执行器:Excutor 是一个消息队列进程,它被绑定到调度器中,用于确定实际执行每个任务计划的工作进程。有不同类型的执行器,每个执行器都使用一个指定工作进程的类来执行任务。例如,LocalExecutor 使用与调度器进程在同一台机器上运行的并行进程执行任务。其他像 CeleryExecutor 的执行器使用存在于独立的工作机器集群中的工作进程执行任务。

  1. Workers:这些是实际执行任务逻辑的进程,由正在使用的执行器确定。

有关 Airflow 的更多核心概念和初步认识,可以参考文章:

Understanding Apache Airflow’s key concepts

Airflow 工作流程

airflow运行流程

  1. 用户编写Dag文件

  1. SchedulerJob发现新增DAG文件,根据starttime \endtime\schedule_interval将Dag转为Dagrun。由于Dag仅仅是一个定位依赖关系的文件,因此需要调度器将其转为具体的任务。在细粒度层面,一个Dag转为若干个Dagrun,每个dagrun由若干个任务实例组成,具体来说,每个operator转为一个对应的Taskinstance。Taskinstance将根据任务依赖关系以及依赖上下文决定是否执行。

  1. 任务的执行将发送到执行器上执行。具体来说,可以在本地执行,也可以在集群上面执行,也可以发送到celery worker远程执行。

  1. 在执行过程中,先封装成一个LocalTaskJob,然后调用taskrunner开启子进程执行任务。

组件处理层次

  1. Scheduler负责创建dagrun和taskinstance

  1. Executor负责安排多个taskinstance执行,这里主要包括根据优先级进行排序和并行度的控制

  1. LocalTaskJob负责代理taskinstance的执行,主要包括对于外部的干预的处理

  1. Taskrunner负责开启子进程:subprocess或者fork形式,或者开启资源隔离的模式

  1. taskinstance 负责整个算子逻辑的执行,包括异常处理和重试等

架构图

airflow源码精读 四_第1张图片
airflow源码精读 四_第2张图片
airflow源码精读 四_第3张图片

你可能感兴趣的:(调度系统,python)