EMR 7.5中PySpark代码在Graviton实例运行失败排查
解决AWS EMR Graviton实例上PySpark Conda环境无法执行二进制文件的问题
错误cannot execute binary file和退出码126明确指向架构不兼容,即使添加了--platform-linux-aarch64仍未解决,可能是以下原因及对应解决方案:
1. 构建环境的架构与目标集群不匹配
你大概率是在x86架构机器上构建Conda环境,跨架构构建存在核心问题:
- Conda的
--platform仅控制官方包的下载架构,但pip安装的编译型依赖会默认按当前机器架构编译/下载x86版本,这类二进制文件无法在Graviton(aarch64)实例上运行。 - 部分Conda包存在跨架构兼容瑕疵,仅靠
--platform参数无法生成纯净的aarch64环境。
解决办法:
在aarch64架构机器上构建环境(比如临时启动一台r7g测试实例),执行以下步骤:
# 在Graviton实例上运行 conda create -n pyspark python=3.9 --channel conda-forge --override-channels conda init bash python -m pip install conda-pack conda run -n pyspark python -m pip install -r req.txt conda pack -n pyspark --output ./pulse-spark-deployment.tar.gz
将打包后的环境上传到S3,再提交Spark任务即可。
2. 跨架构构建时未强制pip使用aarch64架构
如果必须在x86机器上构建,需同时强制Conda和pip都采用aarch64架构:
# 全局设置Conda子目录为aarch64 conda config --set subdir linux-aarch64 # 创建aarch64架构的Conda环境 conda create -n pyspark python=3.9 --platform linux-aarch64 --channel conda-forge --override-channels # 安装pip包时,强制下载aarch64二进制轮子 conda run -n pyspark python -m pip install --platform linux_aarch64 --only-binary=:all: -r req.txt # 打包环境 conda pack -n pyspark --output ./pulse-spark-deployment.tar.gz
3. 验证打包环境的架构正确性
打包完成后,可通过以下步骤确认环境是否为aarch64架构:
- 解压tar.gz文件:
tar -xzf pulse-spark-deployment.tar.gz - 检查Python二进制的架构:
file ./bin/python
输出应包含ARM aarch64或64-bit ARM字样;如果显示x86-64,说明环境仍为x86架构,需重新构建。
4. 检查Spark提交命令细节
- 确认S3路径中的
<bucke>拼写正确(你当前命令存在拼写错误) - 确保
--archives参数中的#environment别名正确,解压后确实存在./environment/bin/python路径
内容的提问来源于stack exchange,提问作者Guillaume
相关产品推荐
相关产品推荐

