Airflow从2.2.0升级到2.9.0后出现' ti' KeyError报错求助
问题定位
报错中的KeyError: ' ti'(带前置空格的变量)说明日志文件名渲染时,模板字符串存在格式错误的变量{ ti},而Airflow标准模板变量应为{ti}。结合升级后出现、无DAG也触发的现象,问题根源是数据库或配置文件中残留了带空格的日志模板配置,升级过程中未被正确覆盖。
解决步骤
检查并修正airflow.cfg日志模板配置
打开airflow.cfg,找到[logging]区块的task_log_template参数,确保值中的变量无多余空格。标准格式示例:task_log_template = {{ ti.dag_id }}/{{ ti.task_id }}/{{ ti.execution_date }}/{{ ti.try_number }}.log若发现
{ ti}格式的变量,直接修改为{ti},保存后重启Airflow服务。检查并修复元数据库中的残留配置
连接到PostgreSQL元数据库,执行以下SQL查询日志相关配置:SELECT key, value FROM config WHERE key LIKE '%log_template%';若查询结果中
value字段存在{ ti},执行更新语句修正:UPDATE config SET value = REPLACE(value, '{ ti}', '{ti}') WHERE key LIKE '%log_template%';重新执行完整数据库迁移
之前指定--to-version可能跳过中间迁移步骤,导致配置未同步。运行完整迁移命令:airflow db migrate临时切换日志处理器验证
报错中涉及Azure WASB日志处理器,可临时切换回默认文件日志处理器测试:
修改airflow.cfg中task_log_reader为:task_log_reader = file.task重启调度器后运行测试DAG,若不再报错,说明WASB处理器的模板配置存在问题,需进一步检查WASB相关日志模板参数。
清理旧任务实例数据
若数据库中残留旧版本任务实例的错误配置引用,可清理历史任务实例(操作前备份数据库):airflow db clean --clean-before-today
验证
完成上述操作后,重启Airflow调度器与Worker,运行一个简单测试DAG(如下),确认任务正常执行且无KeyError:
from airflow import DAG from airflow.operators.python import PythonOperator from datetime import datetime def test_func(): print("Test task executed successfully") with DAG( 'test_upgrade_dag', start_date=datetime(2024,5,1), schedule_interval=None ) as dag: test_task = PythonOperator( task_id='test_task', python_callable=test_func )
内容的提问来源于stack exchange,提问作者Abe Brandsma

