Airflow从2.0.2升级至2.8.1后出现ImportError问题求助
Airflow 2.0.2 升级到 2.8.1 报错问题
我在本地开发环境尝试将Airflow版本从2.0.2升级到2.8.1,但出现如下错误。回退至2.0.2版本时一切正常,请问有人知道问题所在吗?
local-runner-1 | 上述异常是导致后续异常的直接原因: local-runner-1 | local-runner-1 | 回溯(最近的调用最后): local-runner-1 | 文件 "/usr/local/airflow/.local/lib/python3.11/site-packages/airflow/models/dagbag.py", 第344行, 在 parse中 local-runner-1 | loader.exec_module(new_module) local-runner-1 | 文件 "<frozen importlib._bootstrap_external>", 第940行, 在 exec_module中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第241行, 在 _call_with_frames_removed中 local-runner-1 | 文件 "/usr/local/airflow/dags/my-dag-folder/other_folder/dag_data_export.py", 第5行, 在 <module>中 local-runner-1 | from common.create_task import create_task local-runner-1 | 文件 "/usr/local/airflow/plugins/common/create_task.py", 第1行, 在 <module>中 local-runner-1 | from common.my_ssh_operator import YmSSHOperator local-runner-1 | 文件 "/usr/local/airflow/plugins/common/my_ssh_operator.py", 第4行, 在 <module>中 local-runner-1 | from airflow.contrib.operators.ssh_operator import SSHOperator local-runner-1 | 文件 "/usr/local/airflow/.local/lib/python3.11/site-packages/airflow/utils/deprecation_tools.py", 第63行, 在 getattr_with_deprecation中 local-runner-1 | raise ImportError(error_message) from e local-runner-1 | ImportError: 尝试导入 `airflow.contrib.operators.ssh_operator.SSHOperator` 时无法导入 `airflow.providers.ssh.operators.ssh.SSHOperator`。 local-runner-1 | ERROR [airflow.models.dagbag.DagBag] 导入失败: /usr/local/airflow/dags/my-dag-folder/other_folder/dag_data_rdbms_export.py local-runner-1 | 回溯(最近的调用最后): local-runner-1 | 文件 "/usr/local/airflow/.local/lib/python3.11/site-packages/airflow/utils/deprecation_tools.py", 第56行, 在 getattr_with_deprecation中 local-runner-1 | return getattr(importlib.import_module(new_module), new_class_name) local-runner-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ local-runner-1 | 文件 "/usr/local/lib/python3.11/importlib/__init__.py", 第126行, 在 import_module中 local-runner-1 | return _bootstrap._gcd_import(name[level:], package, level) local-runner-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1204行, 在 _gcd_import中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1176行, 在 _find_and_load中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1126行, 在 _find_and_load_unlocked中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第241行, 在 _call_with_frames_removed中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1204行, 在 _gcd_import中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1176行, 在 _find_and_load中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1126行, 在 _find_and_load_unlocked中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第241行, 在 _call_with_frames_removed中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1204行, 在 _gcd_import中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1176行, 在 _find_and_load中 local-runner-1 | 文件 "<frozen importlib._bootstrap>", 第1140行, 在 _find_and_load_unlocked中
问题原因与解决办法
- 原因:Airflow 2.x 开始将原
contrib目录下的模块迁移到providers包体系中,airflow.contrib.operators.ssh_operator.SSHOperator已被废弃,2.8.1版本不再默认提供该旧路径的兼容导入,且大概率你未安装对应的SSH providers包。 - 解决步骤:
- 修改代码导入路径:打开
/usr/local/airflow/plugins/common/my_ssh_operator.py,将第4行的旧导入语句
替换为新路径from airflow.contrib.operators.ssh_operator import SSHOperatorfrom airflow.providers.ssh.operators.ssh import SSHOperator - 安装SSH providers包:执行以下命令完成安装
pip install apache-airflow-providers-ssh - 版本兼容检查:确保安装的providers版本与Airflow 2.8.1匹配,避免版本冲突。
- 修改代码导入路径:打开
内容的提问来源于stack exchange,提问作者palamuGuy
相关产品推荐
相关产品推荐

