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 脚本)的项目目录。
二、从创建到导出的完整操作流程
在终端中,首先设置 Airflow 的家目录(推荐使用项目专用目录)。
- 打开终端(Terminal),创建并进入你的项目目录:
mkdir ~/airflow_projects/my_workflow && cd ~/airflow_projects/my_workflow - 设置环境变量(可写入
~/.zshrc持久化):
export AIRFLOW_HOME=~/airflow_projects/my_workflow - 初始化 Airflow 的元数据库:
airflow db init - 创建管理员用户(用于登录 Web UI):
airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com
按提示设置密码。
- 在新的终端窗口或标签页中,启动 Web 服务器:
airflow webserver --port 8080 - 再打开一个新的终端窗口或标签页,启动调度器:
airflow scheduler - 此时,在浏览器中访问
http://localhost:8080,使用步骤 1 创建的用户名和密码登录,即可看到 Web UI。
在 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。
- 刷新 Web UI 的 DAGs 列表页面,稍等片刻即可看到
my_first_dag出现。 - 点击 DAG 名称进入详情页。
- 在 DAG 详情页,点击右上角的 “开关”按钮(位于 DAG ID 右侧)以激活(unpause)该 DAG。激活后,调度器会根据
schedule_interval自动调度运行。 - 若要立即手动触发一次运行,点击 “Trigger DAG” 按钮(带播放图标)。
- 在“树状图”或“图表”视图中,可以观察任务实例的状态变化(如 queued, running, success, failed)。
- 在树状图或图表视图中,点击一个任务实例(如
print_date)的方块。 - 在弹出的菜单中,选择 “Log”。
- 日志页面将显示该任务实例执行时的标准输出和错误信息,这是排查任务失败原因的主要途径。
- 重试失败任务:在任务实例菜单中,选择 “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 代码 |









