请解释 Airflow 中 Task Instance 的概念,并说明它和 Task 之间的核心差异是什么?
考察说明
考查对 Airflow 核心抽象模型的理解,区分静态定义与动态运行实例。
回答思路
- 【回答框架 1】Task 是 DAG 中的静态定义节点,描述要执行的具体操作、依赖关系和参数配置,类似于一个类或蓝图;Task Instance 是 Task 在某个特定 DAG 运行(DAG Run)中的具体执行实例,类似于基于类创建的对象,拥有独立的运行状态和执行上下文。
- 【回答框架 2】每个 DAG Run 会为包含的每个 Task 创建对应的 Task Instance,并赋予唯一的 task instance key,由 DAG ID、Task ID 和执行日期共同确定。Task Instance 记录该次运行的尝试次数、开始/结束时间、当前状态(如 queued、running、success、failed、up_for_retry 等)以及执行日志等元数据,用于追踪和重试。
- 【回答框架 3】区别的核心在于:Task 是静态的配置,不携带运行状态,可被多个 DAG Run 复用;Task Instance 是动态的运行实体,绑定特定运行周期,每次 DAG 触发都会生成新实例,其状态会随执行过程变化。理解两者之分有助于正确设计 DAG 与排查调度问题。
- 【回答框架 4】在实际使用中,通过 context 传入的 ti 对象即可访问当前 Task Instance 的属性,如 ti.xcom_pull 获取 XCom 数据;而 Task 对象本身的参数如 retries、retry_delay 是定义执行策略,具体生效则体现在每个 Task Instance 的重试行为上。
- 【回答框架 5】可将概念映射到操作系统进程:Task 等同于可执行文件,Task Instance 等同于运行中的进程,多个进程可同时运行同一可执行文件,类似同一 Task 可在不同 DAG Run 中并发执行,但实例间互不干扰。
- 【关键点 1】Task 是静态定义,Task Instance 是 Task 在特定 DAG Run 中的一次具体执行。
- 【关键点 2】Task Instance 的唯一标识由 DAG ID、Task ID 和执行日期组成。
- 【关键点 3】Task Instance 携带独立的运行状态与元数据,支持重试与追踪。
- 【关键点 4】同一 Task 可在不同 DAG Run 中生成多个独立实例,互不影响。
- 【关键点 5】通过 context 可访问当前 Task Instance(ti)以进行 XCom 等操作。
- 【易错点 1】混淆 Task 和 Task Instance 可能导致误以为 Task 状态会持续保存或跨运行共享,实际上状态都绑定实例。
- 【易错点 2】忽略 DAG Run 对实例的绑定关系,在调试时定位不到具体运行时上下文。
- 【易错点 3】将 Task 参数当成运行时状态,误以为修改定义会影响已运行实例。