K8s SparkOperator运行Spark作业访问Minio s3a端点Executor丢失jar包报错
问题根因
你在deps.jars中配置的远程Maven依赖,仅被Spark Driver节点下载到了本地临时目录,Executor启动时无法正常拉取这些依赖包,所以触发了找不到jar文件的错误。另外你当前配置的s3a端点为127.0.0.1:9000,在K8S集群中该地址指向Pod自身,无法访问到外部的Minio服务,后续依赖问题解决后也需要修改该配置。
解决方案(推荐优先使用第一种)
方案1:将依赖包内置到Spark镜像中(稳定性最高)
修改你的Dockerfile,提前将S3A相关依赖下载到Spark的默认类路径目录下,修改后的内容如下:
FROM spark-base/spark-py:1.0.0 USER root:root # 下载s3a所需依赖到Spark默认jars目录 RUN cd /opt/spark/jars && \ curl -O https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.2.0/hadoop-aws-3.2.0.jar && \ curl -O https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.375/aws-java-sdk-bundle-1.11.375.jar && \ chmod 644 hadoop-aws-3.2.0.jar aws-java-sdk-bundle-1.11.375.jar WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY main.py . USER 1001
重新构建镜像后,修改SparkApplication配置:
- 删除
spec.deps.jars的相关配置,依赖已经内置到镜像中无需额外配置 - 修改
spec.hadoopConf中的fs.s3a.endpoint为K8S集群可访问的Minio服务地址,同时补全Minio认证配置:
hadoopConf: "fs.s3a.endpoint": "http://<你的Minio服务IP或域名>:<端口>" "fs.s3a.access.key": "<Minio AccessKey>" "fs.s3a.secret.key": "<Minio SecretKey>" "fs.s3a.path.style.access": "true" "fs.s3a.connection.ssl.enabled": "false" # 若Minio未开启HTTPS需要配置该参数
方案2:不修改镜像,调整SparkApplication配置
如果不想重新构建镜像,可以添加Spark配置让Executor启动前自动下载远程依赖:
在SparkApplication的spec下新增sparkConf配置,同时保留原有deps.jars配置:
spec: # 原有其他配置保持不变 sparkConf: "spark.kubernetes.executor.initContainers.downloadRemoteJars.enabled": "true" "spark.driver.extraClassPath": "/tmp/spark-jars/*" "spark.executor.extraClassPath": "/tmp/spark-jars/*"
同样需要按照方案1的说明修正hadoopConf中的Minio访问地址和认证配置。
内容的提问来源于stack exchange,提问作者Arthur Cesarino
相关产品推荐
相关产品推荐

