使用Scala从Docker部署的MongoDB读数据到Spark返回0条记录,是什么原因?
Spark读取MongoDB返回空DataFrame解决方案
- 首先排查端口配置错误:当前脚本中Mongo服务端口填的是8081,该端口默认是Mongo Express可视化面板的Web端口,MongoDB数据库服务默认监听端口为27017,请先确认你的MongoDB服务实际监听端口,将
mongoServerName中的端口替换为正确的数据库端口。 - 验证连接有效性:优先使用Mongo Shell验证账号权限、连接地址是否正确,执行如下命令:
mongo "mongodb://xyz:xyz@<Mongo服务IP>:<正确端口>/mydb?authSource=mydb" # 进入库后执行计数验证 use mydb db.myCollection.count()
如果返回结果不是24,说明连接地址、账号权限存在问题,先修复该部分问题再调试Spark代码。
- 检查Mongo Spark连接器版本匹配:不同Spark版本对应不同的连接器版本,需保证版本兼容:
- Spark 3.x 对应连接器版本10.x+,启动任务时需指定对应依赖,例如Scala 2.12环境下添加启动参数:
--packages org.mongodb.spark:mongo-spark-connector_2.12:10.2.1 - Spark 2.x 对应连接器版本2.4.x,对应依赖为:
--packages org.mongodb.spark:mongo-spark-connector_2.11:2.4.3
- Spark 3.x 对应连接器版本10.x+,启动任务时需指定对应依赖,例如Scala 2.12环境下添加启动参数:
- 排查Docker网络连通性:如果Spark运行在Docker容器中,先进入容器执行
nc -zv host.docker.internal <Mongo端口>验证网络连通,不通的话可以替换为宿主机器的实际局域网IP测试。 - 可选:手动指定Schema避免自动推断失败,示例如下:
import org.apache.spark.sql.types._ val customSchema = StructType(Seq( StructField("_id", StringType, nullable = true), StructField("你的字段1", StringType, nullable = true), StructField("你的字段2", IntegerType, nullable = true) // 按实际集合字段补全 )) val mongoDf = spark.read.format("com.mongodb.spark.sql.DefaultSource") .option("uri", mongoConnectionString) .schema(customSchema) .load()
- 无认证环境适配:如果你的MongoDB未开启身份认证,直接去掉连接字符串中的账号密码部分,修改为:
mongodb://$mongoServerName/$mongoDbName.$mongoCollection
内容的提问来源于stack exchange,提问作者Shantanu Gupta
相关产品推荐
相关产品推荐

