Airflow 2.0 CeleryExecutor启动worker报'int'无startswith属性排查
问题根因定位
这个AttributeError: 'int' object has no attribute 'startswith'报错是Celery参数解析时接收到了非字符串类型的参数导致的,属于Airflow 2.0和Celery版本不兼容、或者参数配置类型错误的典型问题,也是你任务一直卡在queued状态的直接原因:Celery Worker启动失败,没有消费调度器分配的排队任务。
追踪Airflow传递给Celery参数的方法
你可以通过以下两种方式快速拿到传递的参数值:
- 临时修改Celery命令源码:打开报错栈里提到的
/usr/local/lib/python3.8/site-packages/airflow/cli/commands/celery_command.py文件,找到_run_worker函数中celery_app.worker_main(options)这行代码,在它前面加一行打印逻辑:
重新执行import json print("传递给Celery的参数: ", json.dumps(options, indent=2, default=str))airflow celery worker命令,控制台会输出完整的参数列表,检查列表中是否存在数值类型的元素,找到int类型的参数即可定位问题来源。 - 如果你不想修改源码,直接在启动命令后追加
--verbose参数,Airflow会输出更详细的启动日志,其中也包含传递给Celery的参数信息。
快速修复方案
- 首先核对开发环境和正常的预发/生产环境的依赖版本,执行
pip freeze | grep -E "apache-airflow|celery",确认三个环境的Airflow、Celery版本完全一致。这个问题90%的场景是开发环境不小心升级了Celery到5.x版本,而Airflow 2.0仅适配Celery 4.4.x版本,将Celery降级到4.4.7即可直接解决:pip install celery==4.4.7 - 如果版本一致,检查你开发环境的
airflow.cfg中Celery相关配置、以及Worker启动的自定义脚本,是否有将字符串类型的参数配置为数值类型,比如worker_concurrency之外的自定义参数如果传了纯数字的int值,就会触发这个解析错误。 - 临时规避可以在启动Worker时强制指定pool和并发参数,跳过自动解析逻辑:
airflow celery worker --pool prefork --concurrency 4
内容的提问来源于stack exchange,提问作者arturkuchynski
相关产品推荐
相关产品推荐

