You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark在AWS EKS集群模式运行时S3AFileSystem类找不到,客户端模式正常求助

问题核心差异原因

Cluster模式和Client模式的核心运行环境不同,导致依赖加载逻辑有本质区别:

  • Client模式:Driver运行在你执行spark-submit的容器内,此时容器本地的$SPARK_CLASSPATH配置直接生效,依赖jar能被Driver和Executor正常加载(Executor从Driver拉取依赖)。
  • Cluster模式:Driver运行在EKS集群新建的Pod中,提交作业的EC2实例上的$SPARK_CLASSPATH不会被Pod继承。如果容器镜像内未正确配置依赖,或者提交命令未明确指定依赖分发策略,Driver/Executor就找不到org.apache.hadoop.fs.s3a.S3AFileSystem类。
解决方案

针对Cluster模式的问题,可通过以下几种方式解决:

1. 提交命令中显式指定依赖jar

在spark-submit中用--jars参数指定容器镜像内已存在的hadoop-aws及AWS SDK jar的绝对路径(用local://前缀表示容器本地路径):

spark-submit \
  --master k8s://https://<EKS_API_ENDPOINT> \
  --deploy-mode cluster \
  --jars local:///opt/spark/jars/hadoop-aws-<匹配版本>.jar,local:///opt/spark/jars/aws-java-sdk-bundle-<匹配版本>.jar \
  --class <你的主类全路径> \
  <你的应用jar路径>

注:需确保镜像内的jar路径和版本与Spark依赖的Hadoop版本兼容(比如Spark 3.3.x对应Hadoop 3.3.x,需用同版本的hadoop-aws)。

2. 预配置容器镜像

修改容器镜像中的Spark默认配置,或直接将依赖jar放入镜像的Spark jars目录:

  • 方式一:在镜像的spark-defaults.conf中添加依赖包配置:
    spark.jars.packages org.apache.hadoop:hadoop-aws:<hadoop版本>,com.amazonaws:aws-java-sdk-bundle:<sdk版本>
    
    启动时Spark会自动下载对应依赖(需确保Pod能访问Maven仓库)。
  • 方式二:将hadoop-aws和aws-java-sdk-bundle jar直接复制到镜像的$SPARK_HOME/jars目录下,Cluster模式启动时会自动加载这些jar。

3. 通过Spark配置指定类路径

在spark-submit中设置spark.driver.extraClassPath和spark.executor.extraClassPath,指向容器内的依赖jar路径:

spark-submit \
  --master k8s://https://<EKS_API_ENDPOINT> \
  --deploy-mode cluster \
  --conf spark.driver.extraClassPath=/opt/spark/jars/hadoop-aws-<匹配版本>.jar:/opt/spark/jars/aws-java-sdk-bundle-<匹配版本>.jar \
  --conf spark.executor.extraClassPath=/opt/spark/jars/hadoop-aws-<匹配版本>.jar:/opt/spark/jars/aws-java-sdk-bundle-<匹配版本>.jar \
  --class <你的主类全路径> \
  <你的应用jar路径>

内容的提问来源于stack exchange,提问作者Gaps Sunnskyfsynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:15:06