PySpark对接AWS无法使用外部凭证进程,但AWS CLI可正常运行
解决方案:让PySpark兼容AWS credential_process凭证方式
针对你在Docker容器中运行Glue本地代码时,无法通过credential_process获取AWS凭证的问题,以下是可落地的解决步骤:
1. 强制指定S3A客户端的凭证提供者并传递配置路径
Spark的Hadoop S3A客户端默认凭证链可能未正确加载ProfileCredentialsProvider,需显式配置并确保JVM能读取到AWS配置文件:
import os # 先设置环境变量,确保JVM进程能读取到 os.environ['AWS_PROFILE'] = 'default' os.environ['AWS_CONFIG_FILE'] = '/root/.aws/config' import findspark findspark.init() # 初始化SparkContext时配置S3A参数 sc = SparkContext() # 指定使用Profile凭证提供者 sc._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", "com.amazonaws.auth.profile.ProfileCredentialsProvider") # 指定要使用的AWS profile sc._jsc.hadoopConfiguration().set("fs.s3a.profile", "default") # 显式指定AWS配置文件路径 sc._jsc.hadoopConfiguration().set("fs.s3a.aws.config.file", "/root/.aws/config") glueContext = GlueContext(sc) spark = glueContext.spark_session
2. 修复credential_process脚本的环境依赖问题
JVM调用外部脚本时使用非交互式shell,不会自动加载conda环境配置,导致conda activate可能失效:
- 修改
creds_process.sh,直接使用conda环境的Python绝对路径,跳过激活步骤:#!/usr/bin/env bash # 直接调用glue_env环境下的python,无需激活conda /opt/miniconda3/envs/glue_env/bin/python /root/path/dev_credential_update.py "$1" "$2" "$3" - 确保脚本有执行权限:
chmod +x /root/cloud_workflow/creds_process.sh
3. 调试credential_process的执行日志
为排查脚本是否被正确调用、是否有执行错误,在creds_process.sh开头添加日志输出:
#!/usr/bin/env bash # 把脚本的所有输出和错误写入日志文件 exec > /tmp/creds_process.log 2>&1 /opt/miniconda3/envs/glue_env/bin/python /root/path/dev_credential_update.py "$1" "$2" "$3"
执行代码后,查看/tmp/creds_process.log内容,确认脚本是否正常输出符合AWS格式的凭证JSON。
4. 验证AWS Java SDK版本兼容性
AWS Java SDK 1.11.500及以上版本才支持credential_process特性,Glue 4.0对应的Spark包理论上满足,但可检查容器中Hadoop依赖的AWS SDK版本:
ls /path/to/spark/jars/aws-java-sdk-core-*.jar
若版本低于1.11.500,需替换为对应版本的jar包。
5. 确保Jupyter进程的环境变量正确传递
若Jupyter通过systemd或其他方式启动,可能未继承用户环境变量,需在Jupyter启动配置中添加:
export AWS_PROFILE=default export AWS_CONFIG_FILE=/root/.aws/config
或在Jupyter Notebook的内核配置中添加这些环境变量。
内容的提问来源于stack exchange,提问作者RyWilliamson
相关产品推荐
相关产品推荐

