如何在HDP 2.6的Zeppelin中通过Spark2读取MongoDB集合?
在HDP 2.6环境中通过Zeppelin的Spark2解释器读取MongoDB集合的解决方案
我来帮你搞定这个场景下的MongoDB读取问题,结合你给出的环境信息(Scala 2.11.8、Spark 2.2.0、MongoDB 3.4.14,使用mongo-spark-connector 2.2.2 + mongo-java-driver 3.5.0),这些版本搭配是完全兼容的,接下来咱们一步步解决:
第一步:确保Zeppelin Spark2解释器加载了正确的依赖
在Zeppelin的Spark2解释器配置页面,找到Dependencies部分,添加以下两个依赖(可以直接用Maven坐标,或者指定本地jar包路径):
org.mongodb.spark:mongo-spark-connector_2.11:2.2.2(注意_2.11要和你的Scala版本对应)org.mongodb:mongo-java-driver:3.5.0
添加完成后,一定要重启Spark2解释器,否则依赖不会生效。
第二步:修正并运行读取代码
你之前的代码没写完,而且可以简化一下(Zeppelin的Spark2解释器已经自动初始化了SparkSession,不用写spark.sparkSession),这里给出两种完整的可运行代码:
方式一:通过URI直接指定数据库和集合
// 导入必要的包 import org.apache.spark.sql.mongodb.MongoSpark import com.mongodb.spark.config.ReadConfig // 配置读取参数,指定读偏好为secondaryPreferred val customReadConfig = ReadConfig(Map( "readPreference.name" -> "secondaryPreferred", "uri" -> "mongodb://127.0.0.1:27017/test.collections" )) // 加载MongoDB集合为DataFrame val df5 = MongoSpark.load(spark, customReadConfig) // 验证读取结果,显示前10条数据 df5.show() // 查看集合的Schema结构 df5.printSchema()
方式二:分开指定数据库和集合(更直观)
如果觉得URI里写库和集合不够清晰,可以拆分参数:
import org.apache.spark.sql.mongodb.MongoSpark import com.mongodb.spark.config.ReadConfig val customReadConfig = ReadConfig(Map( "readPreference.name" -> "secondaryPreferred", "uri" -> "mongodb://127.0.0.1:27017/", "database" -> "test", "collection" -> "collections" )) val df5 = MongoSpark.load(spark, customReadConfig) df5.show()
注意事项
- MongoDB认证处理:如果你的MongoDB开启了用户名密码认证,需要在URI中添加认证信息,比如:
mongodb://username:password@127.0.0.1:27017/test.collections?authSource=admin - 网络连通性:确保Zeppelin所在的节点能够访问MongoDB的27017端口,防火墙规则要开放对应端口。
- 依赖版本匹配:千万不要搞错connector的Scala版本后缀,比如你的Scala是2.11,就不能用
_2.12的connector包,否则会出现类找不到的错误。
内容的提问来源于stack exchange,提问作者Chaouki
相关产品推荐
相关产品推荐

