mongodb - 使用密码从 pyspark 连接到 mongodb 时出错
问题描述
我正在运行连接到 mongodb 的 pyspark 代码
sparkConf = SparkConf().setMaster("local").setAppName("MongoSparkConnectorTour").set("spark.app.id", "MongoSparkConnectorTour")
# If executed via pyspark, sc is already instantiated
sc = SparkContext(conf=sparkConf)
sqlContext = SQLContext(sc)
# create and load dataframe from MongoDB URI
df = sqlContext.read.format("com.mongodb.spark.sql.DefaultSource")\
.option("spark.mongodb.input.uri", config.MONGO_URL_AUTH + "/spark.times")\
.load()
在 Docker 映像中使用
CMD [ "spark-submit" \
, "--conf", "spark.mongodb.input.uri=mongodb://root:example@mongodb:27017/spark.times" \
, "--conf", "spark.mongodb.output.uri=mongodb://root:example@mongodb:27017/spark.output" \
, "--packages", "org.mongodb.spark:mongo-spark-connector_2.11:2.4.1" \
, "./spark.py" ]
config.MONGO_URL_AUTH
是mongodb://root:example@mongodb:27017
但我在运行时遇到异常:
db_1 | 2019-10-09T13:44:34.354+0000 I ACCESS [conn4] Supported SASL mechanisms requested for unknown user 'root@spark'
db_1 | 2019-10-09T13:44:34.378+0000 I ACCESS [conn4] SASL SCRAM-SHA-1 authentication failed for root on spark from client 172.22.0.4:49302 ; UserNotFound: Could not find user "root" for db "spark"
pyspark_1 | Traceback (most recent call last):
pyspark_1 | File "/home/ubuntu/./spark.py", line 35, in <module>
pyspark_1 | .option("spark.mongodb.input.uri", config.MONGO_URL_AUTH + "/spark.times")\
pyspark_1 | File "/home/ubuntu/spark-2.4.4-bin-hadoop2.7/python/pyspark/sql/readwriter.py", line 172, in load
pyspark_1 | return self._df(self._jreader.load())
pyspark_1 | File "/home/ubuntu/spark-2.4.4-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py", line 1257, in __call__
pyspark_1 | File "/home/ubuntu/spark-2.4.4-bin-hadoop2.7/python/pyspark/sql/utils.py", line 63, in deco
pyspark_1 | return f(*a, **kw)
pyspark_1 | File "/home/ubuntu/spark-2.4.4-bin-hadoop2.7/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
pyspark_1 | py4j.protocol.Py4JJavaError: An error occurred while calling o34.load.
pyspark_1 | : com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='root', source='spark', password=<hidden>, mechanismProperties={}}
pyspark_1 | at com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:173)
如果我不在 mongodb docker 中使用用户名和密码并且只使用mongodb://mongodb:27017
地址连接,并且使用pymongo
我可以使用密码连接,则此设置中的所有内容都可以完美运行,使用密码时我的 spark 到 mongodb 配置有问题,我可以'不明白什么是错的。
mongodb 的设置(docker-compose 文件的一部分):
db:
image: mongo
restart: always
networks:
miasnet:
aliases:
- "miasdb"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: example
MONGO_INITDB_DATABASE: spark
ports:
- "27017:27017"
volumes:
- /data/db:/data/db
解决方案
https://hub.docker.com/_/mongo内容如下:
MONGO_INITDB_ROOT_USERNAME
,MONGO_INITDB_ROOT_PASSWORD
这些变量一起使用,创建一个新用户并设置该用户的密码。该用户是在管理员身份验证数据库中创建的,并被赋予 root 角色,这是一个“超级用户”角色。
您没有指定身份验证数据库,因此mongo 默认使用当前数据库-spark
在您的情况下。
您需要在连接字符串中指定“admin”身份验证数据库:
spark.mongodb.input.uri=mongodb://root:example@mongodb:27017/spark.times?authSource=admin
spark.mongodb.output.uri=mongodb://root:example@mongodb:27017/spark.output?authSource=admin
推荐阅读
- python - AttributeError:“客户端”对象没有属性“运行”
- reactjs - 使用 immer.js 以不可变的方式更新数组中的一个对象
- ios - 即使我按顺序删除,部分中的行数也无效
- vba - 将公共文件夹添加到我的收藏夹
- php - 当客户端在短时间内发送多个 POST 请求时,GoDaddy 服务器关闭连接
- python-3.x - C 扩展 - 如何将 printf 重定向到 python 记录器?
- amazon-web-services - 如何在 django 中使用多个存储桶?
- algorithmic-trading - 如何从图表对象列表中的指标中公开隐藏的箭头对象
- scala - Scala MurmurHash3 库与 Spark Hash 函数不匹配
- sql - 使用 WHERE 条件显示 2 个列出/GROUP BY 值的总和