Google Cloud Composer中Airflow DAG无法访问依赖模块的问题排查
解决Cloud Composer中DAG无法访问同目录下Python模块的问题
我之前在Beta版的Cloud Composer里也碰到过一模一样的问题!当时本地用Google SDK测试Airflow任务完全正常,但一到K8s容器执行就报No module named xxx的错误,折腾了好一阵才搞明白原因和解决办法:
问题根源
Cloud Composer的Kubernetes任务容器默认不会把DAG目录添加到Python的系统路径中。虽然用gcloud composer environments run这类命令测试时,是直接在Composer的控制节点环境中运行,能访问到DAG目录下的文件,但K8s创建的独立任务容器有自己的Python路径配置,导致找不到同目录的自定义模块。
可行的解决方案
1. 将自定义模块安装到Composer的Python环境
这是最稳妥的长期方案,适合需要多个DAG共享的模块:
- 把你的自定义Python代码打包成标准的Python包(比如生成
.whl或.tar.gz文件),或者直接在requirements.txt里指定本地包路径(如果是私有包的话)。 - 然后用gcloud命令更新Composer环境,安装这些包:
这样你的模块会被安装到所有任务容器的Pythongcloud composer environments update YOUR_COMPOSER_ENV_NAME \ --location YOUR_REGION \ --update-pypi-packages-from-file requirements.txtsite-packages目录,Web UI和K8s任务都能正常导入。
2. 手动在DAG中添加DAG目录到Python路径
如果只是临时应急,或者单个DAG需要用到同目录模块,可以在DAG文件开头添加这段代码:
import sys import os # 把当前DAG所在的目录添加到Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 现在就能正常导入同目录的模块了 import tester
这种方法不用修改Composer环境配置,但每个需要用到该模块的DAG都要加这段代码,适合小范围使用。
3. 利用Cloud Composer的Plugins目录
Composer专门提供了Plugins目录(对应GCS存储桶里的gs://YOUR_COMPOSER_BUCKET/plugins/),Airflow会自动把这个目录加入Python系统路径:
- 把你的
tester.py上传到GCS的Plugins目录下; - 直接在DAG文件里
import tester即可,不用额外配置路径。
这个方法适合管理多个共享的工具类模块,维护起来很方便。
注意事项
- 如果使用方法2,要确保DAG文件的路径在Composer环境中能被正确解析,
os.path.abspath(__file__)不会出现路径错误; - 优先推荐方法1或3,尤其是方法3,更符合Airflow和Cloud Composer的最佳实践。
内容的提问来源于stack exchange,提问作者Soroosh Avazkhani
相关产品推荐
相关产品推荐

