Airflow 1.9.0 ExternalTaskSensor设retry_delay=30清理任务实例报错
Airflow 1.9.0 ExternalTaskSensor 清理任务实例时报错 TypeError: can't pickle _thread.RLock objects
我之前在Airflow 1.9.0版本里也踩过这个坑!情况完全和你说的一样:给ExternalTaskSensor设置retry_delay=30(直接用整数)的时候,DAG跑起来没啥问题,但在GUI里清理任务实例时就会弹出TypeError: can't pickle _thread.RLock objects的错误。但换成retry_delay=timedelta(seconds=30)之后,清理操作就完全正常了。
问题根源
这其实和Airflow内部处理任务实例清理时的deepcopy操作有关。当你直接传整数作为retry_delay时,Airflow在复制传感器配置的过程中,会意外触发对带有_thread.RLock(线程锁)属性的对象进行序列化。而线程锁对象本身是无法被pickle序列化的,这就直接导致了清理流程报错。
而timedelta是Python标准库中的可安全序列化对象,deepcopy操作处理它的时候不会涉及到任何无法被pickle的锁对象,所以整个清理流程就能顺利走完。
解决方案
- 统一使用
timedelta设置重试延迟
不管是ExternalTaskSensor还是其他Airflow传感器,都不要用整数直接设置retry_delay,改用timedelta对象:from datetime import timedelta from airflow.sensors.external_task_sensor import ExternalTaskSensor wait_for_external = ExternalTaskSensor( task_id="wait_for_external_task", external_dag_id="target_dag_id", external_task_id="target_task_id", retry_delay=timedelta(seconds=30), # 这里用timedelta替代整数 retries=3, dag=dag ) - 处理已存在的异常任务实例
如果已经有因为这个配置导致无法清理的任务实例,先修改DAG的retry_delay配置为timedelta类型,重新部署DAG后,再尝试在GUI中执行清理操作。
内容的提问来源于stack exchange,提问作者J.Brouwers
相关产品推荐
相关产品推荐

