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>'))
问题描述
- 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确实存在于容器对应路径。 - 读取数据卡住:改用
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地址")
验证步骤
- 进入Worker容器,执行
curl http://minio:9000,确认网络连通。 - 在Minio控制台确认Bucket名称、文件路径与代码中一致。
- 提交任务后查看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
相关产品推荐
相关产品推荐

