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

Bitnami Spark集群连接Minio的Jar包及数据读取问题排查

Bitnami Spark集群连接Minio存储故障排查与解决

环境配置

Docker-Compose配置

version: '2'

networks:
  spark-network:
    driver: bridge

services:
  minio:
    image: bitnami/minio:latest
    ports:
      - '9000:9000'
      - '9001:9001'
    environment:
      - MINIO_ROOT_USER=<INSERT>
      - MINIO_ROOT_PASSWORD=<INSERT>
    networks:
      - spark-network
  spark:
    image: bitnami/spark:3.3.2
    environment:
      - SPARK_MODE=master
      - SPARK_RPC_AUTHENTICATION_ENABLED=no
      - SPARK_RPC_ENCRYPTION_ENABLED=no
      - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
      - SPARK_SSL_ENABLED=no
    ports:
      - '8080:8080'
      - '7077:7077'
    networks:
      - spark-network
    depends_on:
      - minio
  spark-worker:
    image: bitnami/spark:3.3.2
    environment:
      - SPARK_MODE=worker
      - SPARK_MASTER_URL=spark://spark:7077
      - SPARK_WORKER_MEMORY=3G
      - SPARK_WORKER_CORES=2
      - SPARK_RPC_AUTHENTICATION_ENABLED=no
      - SPARK_RPC_ENCRYPTION_ENABLED=no
      - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
      - SPARK_SSL_ENABLED=no
    networks:
      - spark-network
    depends_on:
      - spark
      - minio

Spark Session配置

spark = SparkSession.builder \
    .master(f'spark://localhost:7077') \
    .appName("docker_spark_minio_storage") \
    .config('spark.jars', '/opt/bitnami/spark/jars/hadoop-aws-3.3.2') \
    .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \
    .config("spark.hadoop.fs.s3a.endpoint", "http://localhost:9000") \
    .config("spark.hadoop.fs.s3a.access.key", <INSERT>) \
    .config("spark.hadoop.fs.s3a.secret.key", <INSERT>) \
    .config("spark.hadoop.fs.s3a.path.style.access", "true") \
    .getOrCreate()

执行的PySpark代码(本地终端运行)

df = (spark.read
  .format('csv')
  .option('inferSchema', 'true')
  .option('header', 'true')
  .option('delimiter', delimiter)
  .load('s3a://<CONTAINER>/<FILENAME.csv>'))

问题描述

  1. Jar包找不到错误:指定spark.jars为容器内路径/opt/bitnami/spark/jars/hadoop-aws-3.3.2时,报错java.io.FileNotFoundException: Jar /opt/bitnami/spark/jars/hadoop-aws-3.3.2 not found,但该Jar确实存在于容器对应路径。
  2. 读取数据卡住:改用spark.jars.packages拉取org.apache.hadoop:hadoop-aws:3.3.2后,Jar包问题解决,但读取Minio数据时卡在stage 0/0。错误路径会提示文件不存在,说明路径正确时能识别文件,但不确定任务是否在集群运行,终端输出本地路径。调整spark.submit.deployMode等配置无改善。

补充信息

  • 本地用master('local[*]')运行时,相同配置可正常读取Minio数据;集群环境下失败。
  • 本地OpenJDK版本19.0.2,容器为1.8.0_362,PySpark版本均为3.3.2。
  • 容器内可正常运行Spark基础代码(如创建模拟DataFrame)。

解决方案

问题1:Jar包找不到的原因与解决

原因:本地终端运行PySpark时,Spark Driver进程在本地,spark.jars指定的路径是本地文件系统路径,而非容器内路径。容器内的/opt/bitnami/spark/jars/hadoop-aws-3.3.2在本地不存在,因此报错。

解决方式:

  • 方式1:使用spark.jars.packages自动拉取依赖(推荐,无需手动管理Jar包)。
  • 方式2:将容器内的hadoop-aws-3.3.2.jar及配套依赖Jar复制到本地Spark安装目录的jars文件夹。
  • 方式3:通过Docker挂载本地Jar目录到集群所有节点的Spark jars路径,或自定义Bitnami Spark镜像预先包含所需依赖。

问题2:读取数据卡住的原因与解决

核心原因1:Minio Endpoint配置错误

本地配置的http://localhost:9000仅能在宿主机访问Minio,但Spark Worker容器处于spark-network网络中,localhost指向容器自身,而非宿主机。Worker无法通过该地址访问Minio,导致任务阻塞。

修正:将Endpoint改为容器间可访问的服务名:

.config("spark.hadoop.fs.s3a.endpoint", "http://minio:9000")

核心原因2:依赖包不完整

hadoop-aws依赖aws-java-sdk相关组件,仅指定hadoop-aws会导致底层通信缺失,引发任务卡住。

修正:完善spark.jars.packages配置,添加兼容版本的aws-java-sdk-bundle:

.config('spark.jars.packages', 'org.apache.hadoop:hadoop-aws:3.3.2,com.amazonaws:aws-java-sdk-bundle:1.11.901')

辅助修正:Driver网络可达性

本地Driver与容器Worker通信时,Worker需要能回调Driver。若Worker无法解析宿主机地址,会导致任务阻塞。需指定宿主机IP:

.config("spark.driver.host", "你的宿主机IP地址")

验证步骤

  1. 进入Worker容器,执行curl http://minio:9000,确认网络连通。
  2. 在Minio控制台确认Bucket名称、文件路径与代码中一致。
  3. 提交任务后查看Spark Web UI(http://localhost:8080),确认任务是否分配到Worker节点。

JDK版本差异影响

本地JDK19与容器JDK8的差异不是核心问题,PySpark 3.3.2兼容JDK8及以上版本。但需注意:使用spark.jars.packages时,Maven会自动下载对应JDK兼容的依赖包,无需手动调整。若手动复制Jar包,需确保Jar包版本与JDK版本兼容(优先用JDK8编译的包)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:07:22