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

Docker环境下PySpark写入MongoDB遇数据源找不到错误求助

问题:PySpark写入MongoDB时提示DATA_SOURCE_NOT_FOUND错误

错误信息

Py4JJavaError: An error occurred while calling o48.save.
: org.apache.spark.SparkClassNotFoundException: [DATA_SOURCE_NOT_FOUND] Failed to find the data source: mongodb. Please find packages at `https://spark.apache.org/third-party-projects.html`.
    at org.apache.spark.sql.errors.QueryExecutionErrors$.dataSourceNotFoundError(QueryExecutionErrors.scala:73

环境配置

Dockerfile

# Use Python 3.9 as the base image
FROM jupyter/pyspark-notebook:latest

WORKDIR /app

COPY ./requirements.txt ./

RUN conda install --yes --file requirements.txt

COPY ./src ./src

COPY ./csv_data ./csv_data

USER root

docker-compose.yml

version: "3.7"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: beamx
    volumes:
      - .:/app
    ports:
      - 8888:8888
    command: jupyter notebook --allow-root --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.password='sha256:1b88391210c8:20b66daeff713a802e6bd10185ffce8cf9ddb6b9c5934a4fabab218959e8612a'
    depends_on:
      - mongo

  mongo:
    image: mongo:latest
    container_name: mongo
    ports:
      - 27017:27017
    volumes:
      - ./data:/data/db

requirements.txt

pymongo
pyspark[mongodb]

代码示例

from pyspark.sql import SparkSession

csv_file_path = "../csv_data/2023-07-14.csv"
# MongoDB connection details
MONGO_CONNECTION_STRING = 'mongodb://mongo:27017'
DATABASE_NAME = 'mydatabase'
COLLECTION_NAME = 'mycollection'
conn_str = MONGO_CONNECTION_STRING + '/' + DATABASE_NAME + "." + COLLECTION_NAME

conn_str

spark = SparkSession \
    .builder \
    .appName("csvTOmongo") \
    .config("spark.mongodb.read.connection.uri", "mongodb://mongo:27017/mydatabase.mycollection") \
    .config("spark.mongodb.write.connection.uri", "mongodb://mongo:27017/mydatabase.mycollection") \
    .getOrCreate()

df = spark.read.format("csv").option("header", "true").load(csv_file_path)

df.write.format("mongodb").mode("append").save()

问题原因

pyspark[mongodb]仅安装了Python侧的辅助依赖,但PySpark底层依赖Java版的Spark环境,连接MongoDB需要MongoDB Spark Connector(Java包)。conda安装的pyspark[mongodb]不会自动下载这个Java包,导致Spark无法识别mongodb数据源。

解决方法

1. 在SparkSession中指定Connector依赖

修改SparkSession构建代码,添加spark.jars.packages配置,指定对应版本的MongoDB Spark Connector(版本需匹配Spark和MongoDB版本):

spark = SparkSession \
    .builder \
    .appName("csvTOmongo") \
    .config("spark.mongodb.read.connection.uri", "mongodb://mongo:27017/mydatabase.mycollection") \
    .config("spark.mongodb.write.connection.uri", "mongodb://mongo:27017/mydatabase.mycollection") \
    # 替换为匹配你Spark版本的Connector版本,示例为Spark 3.3.x + Scala 2.12
    .config("spark.jars.packages", "org.mongodb.spark:mongo-spark-connector_2.12:3.0.1") \
    .getOrCreate()

版本匹配规则:

  • Spark 3.2.x → Connector 3.0.x
  • Spark 3.3.x → Connector 3.0.x 或 4.0.x
  • Spark 3.4.x → Connector 4.0.x
  • Scala版本需与镜像中的Scala版本一致(jupyter/pyspark-notebook通常用Scala 2.12)

2. 在Dockerfile中提前安装Connector包

如果不想每次启动都下载依赖,可以在Dockerfile中直接下载Java包到Spark的jars目录:

# Use Python 3.9 as the base image
FROM jupyter/pyspark-notebook:latest

WORKDIR /app

COPY ./requirements.txt ./

RUN conda install --yes --file requirements.txt

# 下载MongoDB Spark Connector及依赖包到Spark jars目录
RUN wget -P $SPARK_HOME/jars/ https://repo1.maven.org/maven2/org/mongodb/spark/mongo-spark-connector_2.12/3.0.1/mongo-spark-connector_2.12-3.0.1.jar
RUN wget -P $SPARK_HOME/jars/ https://repo1.maven.org/maven2/org/mongodb/mongodb-driver-sync/4.6.1/mongodb-driver-sync-4.6.1.jar
RUN wget -P $SPARK_HOME/jars/ https://repo1.maven.org/maven2/org/mongodb/bson/4.6.1/bson-4.6.1.jar

COPY ./src ./src

COPY ./csv_data ./csv_data

USER root

3. 可选:简化requirements.txt

pyspark[mongodb]中的mongodb后缀仅提供Python侧的辅助工具,核心依赖是Java Connector,可将requirements.txt修改为:

pyspark
pymongo  # 可选,若无需直接用pymongo操作MongoDB可移除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 23:28:12