Airflow for Mac 工作流管理平台完全指南

Airflow 是一个用于编排、调度和监控工作流的开源平台。在 Mac 环境下,它通常通过命令行和 Web 服务器结合的方式运行,其核心是以编程方式定义、执行和监控复杂的工作流任务。本文将以 Mac 版 Airflow 的标准部署和使用为例,详细介绍其界面、操作流程与实用技巧。

一、核心界面与工作区详解

Airflow 主要由两个部分组成:Web 服务器界面(Web UI)和命令行终端。两者协同工作,共同构成用户的主要操作环境。

1.1 Web 服务器界面(Web UI)

在浏览器中访问 http://localhost:8080(默认端口)后,你将看到以下核心功能区域:

  • 导航栏:位于页面顶部,包含 DAGs、Datasets、Cluster、Browse、Admin 等主要菜单项。
  • DAGs 列表视图:主页默认显示所有 DAG(有向无环图,即工作流)的概览,包括状态(是否开启)、调度间隔、最近任务状态、下次运行时间等。
  • 树状图视图:在单个 DAG 详情页中,可以按时间轴以树形结构可视化任务实例的执行历史和依赖关系。
  • 图表视图:以流程图形式展示 DAG 中所有任务及其依赖关系,是理解和设计工作流最直观的工具。
  • 任务实例详情面板:点击任意任务实例,可查看日志、重试、标记成功/失败等操作选项。

1.2 命令行终端(Terminal)

Airflow 的大部分配置、数据库初始化、DAG 测试和故障排查都通过终端命令完成。关键命令均以 airflow 开头,后接子命令(如 tasks, dags)。工作区即你的 Mac 终端,以及存放 DAG 定义文件(Python 脚本)的项目目录。

二、从创建到导出的完整操作流程

步骤 1:环境初始化与项目创建

在终端中,首先设置 Airflow 的家目录(推荐使用项目专用目录)。

  1. 打开终端(Terminal),创建并进入你的项目目录:

    mkdir ~/airflow_projects/my_workflow && cd ~/airflow_projects/my_workflow
  2. 设置环境变量(可写入 ~/.zshrc 持久化):

    export AIRFLOW_HOME=~/airflow_projects/my_workflow
  3. 初始化 Airflow 的元数据库:

    airflow db init
  4. 创建管理员用户(用于登录 Web UI):

    airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com
    按提示设置密码。
步骤 2:启动核心服务
  1. 在新的终端窗口或标签页中,启动 Web 服务器:

    airflow webserver --port 8080
  2. 再打开一个新的终端窗口或标签页,启动调度器:

    airflow scheduler
  3. 此时,在浏览器中访问 http://localhost:8080,使用步骤 1 创建的用户名和密码登录,即可看到 Web UI。
步骤 3:创建你的第一个 DAG(工作流)

在 AIRFLOW_HOME 目录下,创建 dags 文件夹(如果不存在):mkdir dags。

使用任何文本编辑器或 IDE(如 VS Code)在 dags 文件夹内创建一个 Python 文件,例如 my_first_dag.py。以下是一个简单的示例:


from datetime import datetime
from airflow import DAG
from airflow.operators.bash import BashOperator

with DAG(
    dag_id='my_first_dag',
    start_date=datetime(2023, 10, 1),
    schedule_interval='@daily',
    catchup=False
) as dag:

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

    task2 = BashOperator(
        task_id='echo_hello',
        bash_command='echo "Hello from Airflow!"'
    )

    task1 >> task2  # 定义依赖关系:task1 先执行,然后 task2
    

保存文件。Airflow 调度器会自动扫描 dags 文件夹并加载该 DAG。

步骤 4:在 Web UI 中触发与监控
  1. 刷新 Web UI 的 DAGs 列表页面,稍等片刻即可看到 my_first_dag 出现。
  2. 点击 DAG 名称进入详情页。
  3. 在 DAG 详情页,点击右上角的 “开关”按钮(位于 DAG ID 右侧)以激活(unpause)该 DAG。激活后,调度器会根据 schedule_interval 自动调度运行。
  4. 若要立即手动触发一次运行,点击 “Trigger DAG” 按钮(带播放图标)。
  5. 在“树状图”或“图表”视图中,可以观察任务实例的状态变化(如 queued, running, success, failed)。
步骤 5:查看结果与日志
  1. 在树状图或图表视图中,点击一个任务实例(如 print_date)的方块。
  2. 在弹出的菜单中,选择 “Log”。
  3. 日志页面将显示该任务实例执行时的标准输出和错误信息,这是排查任务失败原因的主要途径。
步骤 6:管理任务状态(常见操作)
  • 重试失败任务:在任务实例菜单中,选择 “Clear”。这将清除该实例的状态,调度器会重新将其排队执行。
  • 标记任务为成功/失败:在任务实例菜单中,选择 “Mark Success” 或 “Mark Failed”。用于手动干预工作流状态,跳过或强制失败某个任务。

关于“导出”:Airflow 工作流本身以 Python 代码形式存在,因此“导出”即是对 DAG 文件(.py)和可能用到的辅助脚本、配置文件进行版本管理(如使用 Git)。Airflow 不提供将整个工作流“导出”为单一可执行文件的机制。

三、常用功能进阶技巧

3.1 使用模板和变量

在任务定义中,可以利用 Jinja2 模板访问运行时变量。


task = BashOperator(
    task_id='templated_task',
    bash_command='echo "Execution date is {{ ds }}"',  # ds 是 Airflow 预置的执行日期变量
    dag=dag,
)

3.2 利用 XCom 在任务间传递小量数据

XCom 允许任务间交换少量数据(如状态码、文件名)。


# 任务 A:推送数据
task_a = PythonOperator(
    task_id='push_data',
    python_callable=lambda ti: ti.xcom_push(key='my_key', value='my_value'),
    dag=dag,
)

# 任务 B:拉取数据
task_b = PythonOperator(
    task_id='pull_data',
    python_callable=lambda ti: print(ti.xcom_pull(task_ids='push_data', key='my_key')),
    dag=dag,
)

3.3 设置任务依赖的多种方式

  • 使用位移运算符:task1 >> task2 >> task3
  • 使用 set_upstream 和 set_downstream 方法:task1.set_downstream(task2)
  • 使用列表:[task1, task2] >> task3 表示 task1 和 task2 都完成后,task3 才开始。

3.4 本地调试 DAG

无需启动完整服务,在终端直接测试 DAG 解析和单个任务:


# 测试 DAG 文件是否有语法错误
python ~/airflow_projects/my_workflow/dags/my_first_dag.py

# 使用 airflow 命令测试单个任务
airflow tasks test my_first_dag print_date 2023-10-01

四、常见问题与解决方案

问题 1:DAG 在 Web UI 中不显示

可能原因与解决:

  • DAG 文件未放在正确目录:确保文件在 AIRFLOW_HOME/dags 下。
  • DAG 文件有 Python 语法错误:在终端运行 python your_dag.py 检查错误。
  • 调度器未运行或未加载:确保 airflow scheduler 进程正在运行,并查看其日志是否有报错。
  • DAG 被过滤:检查 Web UI 左上角的“Hide paused DAGs”等过滤选项。

问题 2:任务一直处于“排队中”(queued)状态不执行

可能原因与解决:

  • 执行器(Executor)配置问题:默认的 SequentialExecutor 一次只能运行一个任务。对于本地开发,可考虑改用 LocalExecutor,需修改 airflow.cfg 中的 executor = LocalExecutor 并重新初始化数据库。
  • 资源不足:检查调度器日志,看是否有关于资源(如 CPU/内存)的警告。

问题 3:修改 DAG 后,Web UI 中的定义未更新

解决:Airflow 默认每 30 秒扫描一次 DAG 文件。可以手动刷新 DAG:在 Web UI 的 DAG 详情页,点击 “Refresh DAG” 按钮(带刷新图标)。或者,增加调度器的解析速度(修改 airflow.cfg 中的 dag_dir_list_interval)。

问题 4:Web 服务器或调度器进程意外退出

解决:通常是由于端口冲突或数据库连接问题。检查端口 8080 是否被占用,或尝试重启服务。查看终端输出的错误日志以获取具体原因。可以使用 lsof -i :8080 查看端口占用情况。

五、Airflow for Mac 常用快捷键汇总

以下快捷键主要针对 Web UI 操作和终端命令。

操作场景 功能描述 快捷键/命令 (Mac)
终端通用 新建终端标签页 Cmd + T
终端通用 清屏 Cmd + K 或 Ctrl + L
终端通用 中断当前命令 Ctrl + C
Airflow 命令 查看所有可用命令 airflow --help
Airflow 命令 查看 DAG 列表 airflow dags list
Airflow 命令 暂停一个 DAG airflow dags pause [dag_id]
Airflow 命令 取消暂停一个 DAG airflow dags unpause [dag_id]
Airflow 命令 触发一个 DAG 运行 airflow dags trigger [dag_id]
Web UI 浏览器 刷新当前页面 Cmd + R
Web UI 浏览器 打开开发者工具 Cmd + Option + I
Web UI (DAG 树状图) 缩放视图 鼠标滚轮 或 触控板双指滑动
代码编辑器 (如 VS Code) 格式化 Python 代码

爱上MAC 一站式Mac软件下载平台
第三方登录
captcha
第三方登录