Airflow scheduler启动报错AttributeError: Can't pickle local object processor_factory
根因定位
这个是Airflow和macOS系统Python多进程默认启动规则的兼容性问题,仅出现在Python 3.8+ + macOS + Airflow < 2.0.2的环境组合中:
- macOS从Catalina版本开始,Python 3.8及更高版本将多进程默认启动方式从
fork调整为spawn,避免内核层面的崩溃风险 - 2.0.2版本之前的Airflow,scheduler的DAG处理进程生成逻辑使用了局部函数作为进程入参,spawn模式下需要将入参序列化(pickle)传输到子进程,局部函数不支持序列化,直接触发第一个核心报错
AttributeError: Can't pickle local object 'SchedulerJob._execute.<locals>.processor_factory' - 进程启动失败后没有生成合法的进程组ID,后续的进程回收逻辑传入了空值,触发衍生报错
TypeError: an integer is required (got type NoneType)
修复方案
- 方案一(推荐):升级Airflow到2.0.2或更高版本,官方在该版本已完成spawn模式适配,升级后直接重启scheduler即可解决问题
- 方案二(适配低版本临时修复):手动指定多进程启动方式为兼容的fork模式,两种操作方式二选一:
- 临时生效:启动Airflow前在当前终端执行命令:
export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES - 永久生效:在
airflow.cfg配置文件的[core]段添加配置:
配置修改后重启scheduler即可生效multiprocessing_start_method = fork - 临时生效:启动Airflow前在当前终端执行命令:
内容的提问来源于stack exchange,提问作者Alex Ngn
相关产品推荐
相关产品推荐

