运行AWS Glue作业时遇ImportError: No module named pyRserve问题求助
解决AWS Glue作业中导入pyRserve模块的ImportError问题
问题背景
你在运行AWS Glue ETL作业时尝试导入纯Python模块pyRserve,遇到了ImportError: No module named pyRserve错误。你的作业已经通过--extra-py-files参数指定了存储在S3上的pyRserve.zip包,但依然无法找到模块。
可能的原因及解决方案
1. 检查pyRserve.zip的文件结构
这是最常见的问题之一。Glue需要zip包解压后,模块的根目录直接暴露在zip的顶层,而不是嵌套在子文件夹中。
- 本地解压你的
pyRserve.zip,确认解压后直接看到pyRserve文件夹(包含模块的__init__.py等核心文件),而不是类似pyRserve-0.9.1/pyRserve这样的嵌套结构。 - 如果结构不对,重新打包:可以用
pip将模块下载到本地目录再打包:
把重新生成的zip上传到S3原路径,再重新运行作业。# 下载pyRserve到指定本地目录 pip install pyRserve -t ./pyRserve_package # 进入目录打包所有文件 cd pyRserve_package zip -r pyRserve.zip .
2. 验证S3路径权限与正确性
- 确认
--extra-py-files参数中的S3路径完全正确(比如没有拼写错误、bucket名称和路径层级匹配)。 - 检查你的Glue角色
AWSGlueServiceRoleDefault是否拥有读取该S3路径的权限。在IAM控制台中查看角色的权限策略,确保包含类似以下的权限配置:{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/jobs/test_trunc/python-libs/pyRserve.zip" }
3. 尝试使用--additional-python-modules参数(适用于Glue 2.0+)
如果你的Glue作业使用的是2.0及以上版本,可以直接通过--additional-python-modules参数让Glue自动安装pyRserve,无需手动打包上传:
- 修改作业的
DefaultArguments,添加:
(指定版本可以避免兼容性问题,你可以根据需要调整匹配的版本号)"--additional-python-modules": "pyRserve==0.9.1" - 这种方式会在作业启动时自动从PyPI下载并安装模块,更适合纯Python模块的场景。
4. 排查模块路径是否被正确加载
可以在脚本中添加路径打印,确认Glue是否将你的zip包添加到了Python路径中:
import sys print("当前Python路径列表:", sys.path) # 再尝试导入模块 import pyRserve
运行作业后查看日志,如果pyRserve.zip的路径没有出现在sys.path中,说明参数配置可能有问题,或者Glue没有正确识别该参数。
总结
优先检查zip包的结构和S3权限,这两个是导致这类问题的最常见因素。如果是较新版本的Glue,使用--additional-python-modules会更省心。
内容的提问来源于stack exchange,提问作者mattalxndr
相关产品推荐
相关产品推荐

