airflow FAQ

本文档总结了Airflow在使用过程中的一些常见问题,包括如何设置环境变量、使用mark_success、rerun任务、控制DAG与任务的暂停与继续执行、BashOperator的注意事项、利用Macros Variables传递参数以及Xcom在任务间传递参数的方法。

1、关于airflow设置环境变量

在BashOperator的env(dict类型)参数中添加环境变量,当然也可以在声明DAG时的default_args中添加env的声明,但需要注意,如果设置了envairflow就不再访问系统的环境变量,所以这里设置的env一定要包含程序运行所需的所有环境变量,否则会出错

import os
local_env = os.environ
local_env['PATH'] = os.environ['PATH'] + ":" + Variable.get('PATH')
local_env['JAVA_HOME'] = Variable.get('JAVA_HOME')
 
在dag的default_args中添加'env':dict(local_env)
 

2、mark_success

当task执行完成,但只是返回值为失败的时候,可以不rerun该task,而是marksuccess,然后继续执行下面的task

UI中的操作暂时未成功,点击总是提示“No task instances to markas successful ”,目前可以通过强制rerun下一个task,使下一个task成功,虽然失败的task的状态未改变,但已经不影响下面的task执行

强制rerun的命令为airflowrun -f -i dag_id task_id execute_time

 

3、rerun

        在UI界面中clear某个task,则airflow会自动rerun该task

        当使用run按钮时,要求使用CeleryExecutor才可执行,因需要使用redis数据库,故暂时未尝试

 

4、hold某个dag或task

      暂时只支持hold(pause)某个dag,可以使用命令airflow pause/unpause dagid来pause或unpause某个dag,也可在页面中点击dag前面的On/Off按钮来unpause/pause某个dag,若当前dag有某个task已经启动,则无法停止,只能保证下一个task不执行

      暂时无法hold或pause某个task,只支持以dag为单位pause

 

5、当使用BashOperator时,command需要调用脚本时,脚本后需要有个空格,否则报错,暂时不清楚原因,但加空格后可以正常执行,如下例,run.sh后需加空格

t1 = BashOperator(
       task_id='process_rankinglist',
       bash_command='/home/rankinglist_processor/run.sh ',
       dag=dag)

 

6、airflow提供了很多Macros Variables,可以直接使用jinja模板语言调用宏变量

templated_command = """
echo "dag_run:{{ dag_run }}"
echo "run_id:{{ run_id }}"
echo "execution_date:{{ execution_date }}"
echo "ts:{{ ts }}"
echo "ti:{{ ti }}"
sleep 3
"""
 
t1 = BashOperator(
       task_id='xcom',
       bash_command=templated_command,
       dag=dag)


但是需要注意,其中的execution_date并不是task的真正执行时间,而是上一周期task的执行时间。

即可以理解为“actual_execution_date= execution_date +schedual_interval”,或者我们换一种说法,我们在airflow上看到一个任务是6am执行的,而且interval=4hours,那么execution_date的值是2am,而不是6am,所以获取某个task的真正执行时间,需要获取execution_date的下个执行周期时间,即使用dag.following_schedule(execution_date)

 

7、使用Xcom在task之间传参

可以直接使用jinja模板语言,在{{}}中调用ti的xcom_push和xcom_pull方法,下面的例子为t1使用xcom_push推出了一个kv,t2通过taskid和key来接收

dag = DAG(
   dag_id='xcomtest', default_args=default_args, schedule_interval='*/2 * ** *')
 
t1 = BashOperator(
   task_id='xcom',
   bash_command='''{{ ti.xcom_push(key='aaa', value='bbb') }}''',
    dag=dag)
 
t2 = BashOperator(
   task_id='xcom2',
    bash_command='''echo"{{ ti.xcom_pull(key='aaa', task_ids='xcom') }}" ''',
    dag=dag)
t2.set_upstream(t1)

<think>我们正在处理用户关于Apache Airflow工作流管理使用指南的请求。根据提供的引用资料,我们可以总结以下关键点: - Airflow是一个用于编程、调度和监控工作流的平台(引用[1]和引用[3])。 - 它使用Python代码定义任务依赖关系,以有向无环图(DAG)的形式管理数据处理流水线(引用[3])。 - Airflow提供了REST API和Python客户端库(引用[2])用于交互式管理。 用户需要的是使用指南,因此我们将从基础开始,逐步介绍如何使用Airflow进行工作流管理。 ### 回答结构: 1. **Airflow核心概念**:解释DAG、任务、算子等基本概念。 2. **安装与配置**:简要介绍安装步骤(基于引用[1])。 3. **创建第一个DAG**:通过一个简单示例展示如何定义工作流。 4. **Airflow的Web界面**:介绍如何监控和管理工作流。 5. **进阶功能**:提及一些高级特性如变量、连接、执行器等。 6. **API与客户端**:介绍如何使用REST API和Python客户端(引用[2])。 7. **最佳实践与常见问题**:提供一些使用建议。 ### 注意事项: - 使用中文回答。 - 数学公式(如果有)按规则使用$...$或$$...$$。 - 生成相关问题。 现在开始编写回答:</think>### Apache Airflow 工作流管理使用指南 Apache Airflow 是一个开源的工作流调度和监控平台,通过 Python 代码定义任务依赖关系,以**有向无环图(DAG)** 的形式管理数据处理流水线[^3]。以下是核心使用指南: --- #### 1. **核心概念** - **DAG(有向无环图)**:工作流的基本单位,由任务和依赖关系组成 - **Operator(算子)**:定义单个任务的执行逻辑(如 `PythonOperator`, `BashOperator`) - **Task**:Operator 的实例,代表具体执行单元 - **Task Dependency**:通过 `>>` 符号定义任务顺序(如 `task1 >> task2`) --- #### 2. **安装与初始化** ```bash # 安装 Airflow pip install apache-airflow # 初始化数据库 airflow db init # 创建管理员用户 airflow users create --username admin --password admin --firstname Admin --lastname User --role Admin --email admin@example.com # 启动 Web 服务器 airflow webserver --port 8080 # 启动调度器 airflow scheduler ``` > 访问 `http://localhost:8080` 登录 Web UI[^1] --- #### 3. **创建第一个 DAG** 在 `airflow/dags/` 目录下创建 `my_first_dag.py`: ```python from airflow import DAG from airflow.operators.bash import BashOperator from datetime import datetime with DAG( dag_id="hello_world", start_date=datetime(2023, 1, 1), schedule_interval="@daily" ) as dag: task1 = BashOperator( task_id="print_date", bash_command="date" ) task2 = BashOperator( task_id="echo_msg", bash_command='echo "Airflow is running!"' ) task1 >> task2 # 定义依赖关系 ``` - **Web UI 操作**:激活 DAG → 触发运行 → 查看任务日志[^3] --- #### 4. **关键功能实践** - **任务依赖控制**: ```python task1 >> [task2, task3] # 任务1完成后并行执行任务2和3 task3 >> task4 # 任务3完成后执行任务4 ``` - **参数传递**:使用 `XCom` 跨任务共享数据 - **错误处理**:设置 `retries` 和 `retry_delay` 实现自动重试 - **监控告警**:配置 `on_failure_callback` 发送邮件/钉钉通知 --- #### 5. **进阶功能** - **REST API**:通过 `apache-airflow-client-python` 管理 DAG[^2] ```python from airflow_client.client.api import dag_api from airflow_client.client import Configuration conf = Configuration(host="http://localhost:8080/api/v1") api = dag_api.DAGApi(conf) print(api.get_dags()) # 获取所有 DAG 信息 ``` - **执行器选择**:支持 `LocalExecutor`(单机)/ `CeleryExecutor`(分布式) - **集成扩展**:支持 KubernetesExecutor、DockerOperator 等容器化方案 --- #### 6. **最佳实践** 1. **DAG 设计原则**: - 单一职责:每个 DAG 专注一个业务目标 - 幂等性:任务可重复执行且结果一致 - 超时设置:避免僵尸任务 2. **性能优化**: - 使用 `@task` 装饰器简化 Python 任务 - 启用 `Pools` 控制并发资源 3. **安全配置**: - 加密敏感变量(`airflow connections add --conn-extra`) - 启用 RBAC 角色权限控制 > 生产环境建议使用 PostgreSQL 作为元数据库,并定期清理历史数据[^1] --- #### 7. **调试与排查** - **常见错误**: - DAG 未显示:检查文件语法错误或 `airflow list_dags` - 任务卡住:确认执行器资源是否充足 - **日志定位**: ```bash airflow tasks logs hello_world print_date --dag hello_world ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值