【MongoDB + Spark】 技术问题汇总与解决方案笔记
场景背景
最近练手项目:Spark 结合 MongoDB 构建商品推荐系统的过程中,过程中出现多种环境配置与兼容性问题,主要涉及 MongoDB 连接、版本兼容性、Casbah 驱动使用问题等。汇总调试过程中遇到的常见错误及其解决方案,供参考复用。
一、MongoDB 无法连接错误
错误现象
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector...
Caused by: java.net.UnknownHostException: linux
原因分析
- MongoDB URI 中使用了错误的主机名
linux
- 本机没有叫
linux
的 host,也没有在hosts
文件中做映射
解决方案
// 将配置中的 URI 改为 localhost 或本地 IP
"mongo.uri" -> "mongodb://localhost:27017/orecommender"
检测连接可以拿navicat去连接
二、MongoDB Shell 无法使用 mongosh
命令
错误现象
'mongosh' 不是内部或外部命令
原因分析
- 安装的是 MongoDB 的旧版本(如 4.x),默认没有 mongosh
- 环境变量配置可能未添加或路径错误
解决方案
- 使用
mongo
命令替代mongosh
- 检查并添加环境变量 Path:
C:\Program Files\MongoDB\Server\4.4\bin
三、连接正常但执行 .dropCollection()
报错
错误现象
com.mongodb.MongoCommandException: Command failed with error 352: 'Unsupported OP_QUERY command: drop'
原因分析
- 当前 MongoDB 为 v5.x 或 v6.x
- 使用的 Casbah 驱动过老,使用了已废弃的
OP_QUERY
协议 - MongoDB 6.0+ 默认禁用了对旧协议的支持
解决方案
- 方法一:注释掉
.dropCollection()
// productCollection.dropCollection()
// ratingCollection.dropCollection()
- 方法二:手动在 Compass 或 mongo shell 中删除集合
use orecommender
db.Product.drop()
db.Rating.drop()
- 方法三(长期):升级 MongoDB Java 驱动 + 改写为 Mongo Spark Connector 10.x
四、兼容推荐版本说明
组件 | 推荐版本 |
---|---|
MongoDB | 4.2.x 或 4.4.x |
Casbah 驱动 | 兼容 Mongo <= 4.4 |
Spark + Mongo 连接器 | Mongo Spark Connector 2.4(老版) |
五、降级 MongoDB 操作步骤(Windows)
- 卸载当前 MongoDB(控制面板)
- 下载旧版本(如 MongoDB 4.4):
- 阿里云镜像:https://developer.aliyun.com/mirror/mongodb
- 安装
.msi
并设置为服务 - 验证:
mongod -version
mongo
六、配置环境变量路径建议
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_xx
MONGO_BIN=C:\Program Files\MongoDB\Server\4.4\bin
- 添加到系统 Path:
%JAVA_HOME%\bin
%MONGO_BIN%