Spark on YARN(EKS)应用启动后因S3访问凭证缺失失败求助
排查配置建议
1. 验证Executor容器的AWS环境变量是否完整传递
初始任务能创建S3 staging目录,说明Driver端凭证有效,但后续失败大概率是Executor端无法获取凭证。需要确认:
- 登录Spark UI的「Executors」页面,查看每个Executor的环境变量,确认所有AWS相关变量(
AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_ROLE_ARN、AWS_WEB_IDENTITY_TOKEN_FILE等)是否存在; - 若YARN NodeManager未自动传递环境变量,需检查
yarn.nodemanager.env-whitelist配置,确保包含所有AWS相关变量;也可在Spark提交时显式传递:spark-submit \ --conf spark.executorEnv.AWS_ACCESS_KEY_ID=<THE_KEY_ID> \ --conf spark.executorEnv.AWS_SECRET_ACCESS_KEY=<THE_KEY> \ --conf spark.executorEnv.AWS_ROLE_ARN=arn:aws:iam::ROLE_NAME \ --conf spark.executorEnv.AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token \ # 其他提交参数
2. 处理Web Identity Token过期问题
你的环境配置了AWS_WEB_IDENTITY_TOKEN_FILE,EKS默认的Web Identity Token有效期为1小时,初始任务启动时token有效,运行超时后会失效。解决方式:
- 显式指定Spark使用Web Identity凭证提供类,强制自动刷新token:
--conf spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.WebIdentityTokenCredentialsProvider - 同时开启S3A客户端的凭证自动刷新:
--conf spark.hadoop.fs.s3a.session.token.renewal.enabled=true \ --conf spark.hadoop.fs.s3a.credentials.refresh.interval=300s
3. 检查S3A客户端的凭证缓存机制
旧版本Hadoop的S3A客户端可能存在凭证缓存不刷新的问题,需确认:
- 你使用的Hadoop版本是否支持Web Identity凭证自动刷新(建议Hadoop 3.3+);
- 关闭S3A的凭证缓存测试:
--conf spark.hadoop.fs.s3a.credentials.cache.enabled=false
4. 区分Driver与Executor的凭证使用阶段
初始的.inprogress文件和staging目录是由Driver端创建的,后续任务的RDD计算、数据读写由Executor执行。可以在代码中添加日志(避免打印敏感信息),分别验证Driver和Executor的凭证状态:
// 在Driver端打印 System.out.println("Driver AWS_ROLE_ARN: " + System.getenv("AWS_ROLE_ARN")); // 在Executor端打印(比如map算子中) rdd.map(x -> { System.out.println("Executor AWS_ROLE_ARN: " + System.getenv("AWS_ROLE_ARN")); return x; }).count();
对比日志中Driver和Executor的环境变量是否一致。
5. 验证IAM角色与S3桶的权限配置
虽然初始能访问S3,但后续操作可能触发了未授权的动作:
- 检查IAM角色的信任策略,确认是否允许EKS对应的OIDC提供商及目标ServiceAccount扮演该角色;
- 检查S3桶的Bucket Policy,确认该IAM角色拥有完整的操作权限(如
s3:PutObject、s3:GetObject、s3:DeleteObject等,不只是初始的mkdir权限)。
内容的提问来源于stack exchange,提问作者JBoy
相关产品推荐
相关产品推荐

