启用MongoDB认证时sqlContext.read.option(...).mongo()执行失败求解决
解决Spark连接需认证的MongoDB失败问题
别担心,这个问题很常见,就是因为你没在Spark的MongoDB配置里加入认证信息导致的。下面给你两种简单可行的解决方案,选一种适合你的就行:
方案1:在连接URI中直接嵌入认证信息
最直接的方式就是把MongoDB的用户名、密码以及认证源(如果需要的话)直接写在URI里。比如你的MongoDB用户是admin,密码是123456,并且是在admin数据库下认证的,那修改后的代码如下:
val sparkSession: SparkSession = SparkSession.builder() .master("local") .appName("MongoSparkConnectorIntro") // 输入URI加入认证信息,authSource指定认证用的数据库(通常是admin) .config("spark.mongodb.input.uri", "mongodb://admin:123456@127.0.0.1/nasa.eva2?authSource=admin") // 输出URI同样需要添加认证信息 .config("spark.mongodb.output.uri", "mongodb://admin:123456@127.0.0.1/nasa.astronautTotals?authSource=admin") .getOrCreate() val sqlContext: SQLContext = sparkSession.sqlContext val evadf: DataFrame = sqlContext.read.option("collection", "eva2").mongo() evadf.printSchema()
注意:把
admin和123456替换成你实际的MongoDB用户名和密码;如果你的用户是直接在nasa数据库下创建的,那可以去掉?authSource=admin这个参数。
方案2:单独配置认证参数
如果你不想把密码明文写在URI里(更安全一点),可以通过单独的配置项来设置认证信息:
val sparkSession: SparkSession = SparkSession.builder() .master("local") .appName("MongoSparkConnectorIntro") .config("spark.mongodb.input.uri", "mongodb://127.0.0.1/nasa.eva2") .config("spark.mongodb.output.uri", "mongodb://127.0.0.1/nasa.astronautTotals") // 配置输入的认证信息 .config("spark.mongodb.input.username", "admin") .config("spark.mongodb.input.password", "123456") .config("spark.mongodb.input.authSource", "admin") // 配置输出的认证信息 .config("spark.mongodb.output.username", "admin") .config("spark.mongodb.output.password", "123456") .config("spark.mongodb.output.authSource", "admin") .getOrCreate() val sqlContext: SQLContext = sparkSession.sqlContext val evadf: DataFrame = sqlContext.read.option("collection", "eva2").mongo() evadf.printSchema()
额外注意事项
- 确保你的MongoDB用户拥有
nasa数据库的读权限(针对输入集合eva2)和写权限(针对输出集合astronautTotals),不然就算认证过了也会报错。 - 如果你的MongoDB开启了SSL,还需要额外添加
ssl=true到URI里,或者配置spark.mongodb.input.ssl=true这类参数。
内容的提问来源于stack exchange,提问作者Dale Angus
相关产品推荐
相关产品推荐

