Airflow调度器报错:datetime.timedelta与float无法比较
Airflow调度器TypeError错误排查思路
错误核心原因
从错误栈追踪可以明确:问题出在任务实例计算下次重试时间时,min(self.task.max_retry_delay, delay) 这行代码试图比较datetime.timedelta和float类型的值,导致类型不兼容错误。本质是某个任务的max_retry_delay参数被配置成了纯数字(float/int),但Airflow要求该参数必须是datetime.timedelta对象。
排查与修复步骤
- 检查所有DAG任务的
max_retry_delay配置:遍历所有DAG文件,找出所有设置了max_retry_delay的任务,确认配置值是否为timedelta类型(比如timedelta(hours=2)),而非纯数字(如2、3.5)。 - 定位具体出错任务:如果DAG数量较多,可以查看调度器日志中报错前后的任务实例记录,或者直接搜索DAG文件中的
max_retry_delay关键字,快速定位配置错误的任务。 - 修正参数配置:将错误的数值配置替换为合法的
timedelta对象,例如把max_retry_delay=2改为max_retry_delay=timedelta(hours=2),修改后记得重启Airflow调度器。 - 版本兼容性检查:如果使用的是较旧的Airflow版本(如1.x系列),建议升级到2.x稳定版本,新版本对参数类型的校验更严格,能提前避免这类隐式错误。
完整错误栈追踪
回溯(最近的调用最后): 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/jobs/scheduler_job.py", 第1275行, 在 _execute中 self._run_scheduler_loop() 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/jobs/scheduler_job.py", 第1377行, 在 _run_scheduler_loop中 num_queued_tis = self._do_scheduling(session) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/jobs/scheduler_job.py", 第1515行, 在 _do_scheduling中 self._schedule_dag_run(dag_run, active_runs_by_dag_id.get(dag_run.dag_id, set()), session) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/jobs/scheduler_job.py", 第1677行, 在 _schedule_dag_run中 schedulable_tis, callback_to_run = dag_run.update_state(session=session, execute_callbacks=False) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/utils/session.py", 第62行, 在 wrapper中 return func(*args, **kwargs) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/dagrun.py", 第405行, 在 update_state中 info = self.task_instance_scheduling_decisions(session) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/utils/session.py", 第62行, 在 wrapper中 return func(*args, **kwargs) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/dagrun.py", 第499行, 在 task_instance_scheduling_decisions中 schedulable_tis, changed_tis = self._get_ready_tis(scheduleable_tasks, finished_tasks, session) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/dagrun.py", 第527行, 在 _get_ready_tis中 session=session, 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/utils/session.py", 第62行, 在 wrapper中 return func(*args, **kwargs) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/taskinstance.py", 第813行, 在 are_dependencies_met中 for dep_status in self.get_failed_dep_statuses(dep_context=dep_context, session=session): 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/taskinstance.py", 第834行, 在 get_failed_dep_statuses中 for dep_status in dep.get_dep_statuses(self, session, dep_context): 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/ti_deps/deps/base_ti_dep.py", 第101行, 在 get_dep_statuses中 yield from self._get_dep_statuses(ti, session, dep_context) 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/ti_deps/deps/not_in_retry_period_dep.py", 第47行, 在 _get_dep_statuses中 next_task_retry_date = ti.next_retry_datetime() 文件 "/home/airflow/.local/lib/python3.6/site-packages/airflow/models/taskinstance.py", 第880行, 在 next_retry_datetime中 delay = min(self.task.max_retry_delay, delay) TypeError: '<' not supported between instances of 'datetime.timedelta' and 'float' [2023-08-18 09:56:20,249] {process_utils.py:95} INFO - 向GPID 237发送Signals.SIGTERM [2023-08-18 09:56:20,502] {process_utils.py:61} INFO - 进程psutil.Process(pid=237, status='terminated', exitcode=0, started='09:56:18') (237)已终止,退出码0 [2023-08-18 09:56:20,503] {scheduler_job.py:1296} INFO - 退出执行循环
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

