Airflow DAG导入Avro模块失败:ModuleNotFoundError问题求助
嗨,我看到你遇到的这个问题真的挺头疼的——明明本地测试和Airflow CLI里都能正常导入Avro,偏偏在Airflow界面里报ModuleNotFoundError: No module named 'avro',之前Spark也踩过类似的坑,换Pandas才解决,现在Avro绕不过去确实闹心!我给你几个实际的排查和解决思路,你可以逐一试试:
先确认Airflow进程的Python环境和你测试的环境是否一致
有时候我们在容器CLI里用的Python和Airflow webserver/worker进程用的不是同一个!你可以在DAG里加一段调试代码,看看Airflow进程能读到的Python路径和已安装包:import sys try: import pkg_resources print("已安装的Avro相关包:", [pkg.key for pkg in pkg_resources.working_set if 'avro' in pkg.key]) except ImportError: pass print("当前Python路径:", sys.path)部署这个DAG后,去Airflow的日志里找输出,然后和你在CLI里运行
python -c "import sys; print(sys.path)"以及pip list | grep avro的结果对比,看看是不是路径或者包的安装位置不对。尝试将Avro安装到系统级Python环境
你提到包安装在了/home/airflow/.local/lib/python3.12/site-packages/,这是pip install --user的结果,但Airflow的进程可能是以系统用户或者非airflow用户运行的,读不到这个用户目录下的包。试试在Docker镜像构建的时候,用不带--user的命令安装:RUN pip install --no-cache-dir avro==1.11.3或者进入容器后直接运行
pip install avro==1.11.3(不加--user),然后重启Airflow服务。别忘重启Airflow服务
很多时候安装完新包后,Airflow的webserver和worker进程不会自动加载新模块,你需要手动重启这两个服务:# 如果是用docker-compose部署的 docker-compose restart airflow-webserver airflow-worker别只测试CLI,重启服务后再去Airflow界面里刷新DAG试试。
排查Python版本兼容性问题
你用的Python 3.12.4是比较新的版本,Avro 1.11.3对3.12的支持可能存在一些隐性问题——虽然CLI里能跑,但Airflow的依赖环境更复杂,可能有冲突。你可以试试降级Python到3.11(Airflow官方推荐的稳定版本),或者升级Avro到最新版本(比如1.12.0),看看能不能解决。确认Docker镜像构建的正确性
如果你是通过requirements.txt构建镜像的,要确保安装命令是在镜像构建阶段执行的,而不是容器启动后手动安装(手动安装的话容器重启后包就没了)。检查你的Dockerfile里是不是有类似这样的命令:COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt并且构建镜像的时候确实执行了这个步骤。
备注:内容来源于stack exchange,提问作者Olti93

