如何将AWS Glue Wheel依赖打包为ZIP/TAR上传?实操方案咨询
你之前按官方、Snowflake文档操作失败,核心原因是文档没写清楚适用边界:打zip传参的方式仅支持纯Python wheel,只要依赖包含C扩展(比如pandas、pyarrow、snowflake-connector-python的加密组件、numpy这类),不提前做环境适配直接打包上传,必然报导入错误,且不同Glue版本的参数说明存在不少写反、遗漏限制条件的问题。
下面按稳定性、易用性排序给出可行方案,第一个方案就是你要的类似jar包整体打包导入的效果,生产环境长期验证无依赖问题:
方案1:预编译适配版全依赖包(推荐,全场景兼容)
这个方案没有运行时拉包、编译的步骤,所有依赖提前准备好,任务启动直接加载,稳定性拉满:
- 先确认你用的Glue版本对应的环境参数:
- Glue 4.0:Python 3.10、Amazon Linux 2、支持x86_64/Graviton2 arm64架构
- Glue 5.0:Python 3.11、Amazon Linux 2023、支持x86_64/Graviton2 arm64架构
- Glue 3.0:Python 3.7、Amazon Linux 2
- 起一台和上述环境完全一致的EC2(或者用对应版本的AWS官方Docker镜像跑本地容器),在环境里执行命令把所有依赖(含传递依赖)的二进制wheel下载到本地目录:
pip download -r requirements.txt -d ./glue_deps --platform manylinux2014_x86_64 --python-version 3.10 --only-binary=:all: --implementation cp
把命令里的platform、python-version替换成你实际用的Glue环境对应值,用Graviton实例的话把platform改成manylinux2014_aarch64 - 不要给wheel文件套额外文件夹:直接进入
glue_deps目录,选中所有下载好的.whl文件,连同你自己的业务py脚本一起,直接打包成zip压缩包(压缩包打开第一层就是whl和py文件,不能是一层同名文件夹,90%的人传包失败都是卡在这里) - 把zip包上传到S3,任务参数按如下配置:
- Python Shell任务:把zip的S3路径填到
--extra-py-files参数,多个路径用逗号分隔 - Spark ETL任务:同样把zip路径填到
--extra-py-files,额外加参数--python-modules-installer-option=--no-deps,避免任务启动时自动去PyPI拉重复依赖
- Python Shell任务:把zip的S3路径填到
这个方案和你上传jar包的逻辑完全一致:一次打包多次复用,不依赖公网连接,启动速度快,Snowflake、PySpark相关的带C扩展的依赖都能正常加载。
方案2:轻量纯Python依赖方案
如果你用的全是纯Python依赖(无C扩展,比如requests、simplejson这类),不需要做环境适配,直接把所有whl文件按上面的打包规则打zip传S3,用--extra-py-files传入即可,这个场景下官方文档描述的方法是有效的。
注意:只要依赖里包含带C扩展的包,绝对不要在本地Mac/Windows环境下打包含wheel的zip,哪怕是本地Linux环境,只要glibc版本和Glue环境不匹配,必然报GLIBC_xxx not found或者导入时段错误。
方案3:自定义镜像方案(重依赖场景)
如果你的依赖除了Python包还需要装系统级组件(比如unixODBC驱动、特定版本的openssl,连Snowflake、Oracle这类数据库经常需要),直接基于AWS官方对应版本的Glue基础镜像,提前把Python依赖、系统依赖全部构建进镜像,推到ECR之后任务直接选自定义镜像运行即可,兼容性最高,缺点是镜像构建、更新流程比传S3包稍复杂。
- 不要用
--additional-python-modules传S3压缩包路径,这个参数只接受PyPI包名+版本号格式(比如snowflake-connector-python==3.6.0),传S3路径完全不生效;且这个参数本质是任务启动时实时去PyPI拉包,遇到VPC无公网、源站波动就会失败,生产环境不推荐用 - 压缩包不要有嵌套目录,打开压缩包第一层必须是直接的whl、py文件,不能套一层文件夹
- 所有二进制wheel必须严格匹配Glue的Python版本、CPU架构、操作系统版本,跨平台下载的wheel直接传必然报错
- Glue Python Shell任务的版本坑:Glue 2.0及更早版本的Python Shell运行环境是Python 3.6,Glue 3.0及之后才升级到Python3.7+,版本不对wheel无法加载
内容的提问来源于stack exchange,提问作者HouKaide

