如何在AWS Glue Job中成功导入py7zr库及解决依赖问题?
解决AWS Glue中py7zr及依赖库的导入问题
核心问题原因
py7zr依赖的pybcj是C扩展库,AWS Glue的运行环境基于Amazon Linux 2 x86_64架构,直接通过--additional-python-modules安装的PyPI包会因编译环境不兼容无法运行;若仅通过--extra-py-files传递源码包,也会因缺少预编译二进制文件报错。
分步解决方法
1. 编译兼容Glue环境的依赖包
需要在与Glue同架构的环境中编译wheel包:
- 使用Amazon Linux 2实例(或本地Docker启动
amazonlinux:2镜像),安装对应Glue版本的Python(比如Glue 3.0用Python 3.7,Glue 4.0用Python 3.9):
执行后,# 安装编译依赖工具 yum install gcc python3-devel -y # 创建并激活虚拟环境 python3 -m venv glue-venv source glue-venv/bin/activate # 编译py7zr及其所有依赖的wheel包 pip wheel py7zr -w ./glue-wheels./glue-wheels目录下会生成所有所需的.whl文件(包括pybcj、pycryptodome等)。
2. 上传wheel包到S3
将所有编译好的.whl文件上传到S3的指定路径,例如s3://your-glue-bucket/dependencies/wheels/,同时确保Glue Job的IAM角色拥有该路径的读取权限。
3. 配置Glue Job参数
在CloudFormation的Glue Job配置中,设置以下参数:
- --extra-py-files:指定所有wheel包的S3路径,多个包用逗号分隔:
注意:必须包含py7zr的所有依赖包,不能遗漏。--extra-py-files s3://your-glue-bucket/dependencies/wheels/py7zr-0.20.0-py3-none-any.whl,s3://your-glue-bucket/dependencies/wheels/pybcj-1.0.1-cp39-cp39-linux_x86_64.whl,s3://your-glue-bucket/dependencies/wheels/pycryptodome-3.19.0-cp39-cp39-linux_x86_64.whl - 无需配置
--additional-python-modules:该参数仅支持纯Python包,无法处理带C扩展的依赖。
4. 脚本中正常导入使用
在Glue脚本开头直接导入py7zr即可:
import py7zr import boto3 from botocore.exceptions import ClientError # 示例:下载S3上的7z文件到临时目录,解压后读取 s3 = boto3.client('s3') try: s3.download_file('your-source-bucket', 'data/file.7z', '/tmp/file.7z') except ClientError as e: print(f"下载文件失败: {e}") with py7zr.SevenZipFile('/tmp/file.7z', mode='r') as archive: archive.extractall(path='/tmp/extracted') # 后续处理解压后的txt文件并加载到RDS...
排查要点
- 确认Glue Job的Python版本和编译wheel包时使用的Python版本完全一致。
- 查看CloudWatch日志,若仍报错,确认是包路径错误还是权限问题,针对性调整。
- 确保所有依赖的wheel包都已上传到S3并添加到
--extra-py-files参数中。
内容的提问来源于stack exchange,提问作者Jorge Godoy
相关产品推荐
相关产品推荐

