无法通过scala中的Spark读取MongoDB次节点

无法通过scala中的Spark读取MongoDB次节点,mongodb,apache-spark,Mongodb,Apache Spark,我编写了一个Spark代码,通过Scala从MongoDB读取数据。以下是一些代码示例: val mongoConfig = new Configuration() mongoConfig.set("mongo.input.uri","mongodb://secondarydb.test.local/testdb.test?readPreference=secondary") val sparkConf = new SparkConf().setMaster("local[5]") val sc

我编写了一个Spark代码,通过Scala从MongoDB读取数据。以下是一些代码示例:

val mongoConfig = new Configuration()
mongoConfig.set("mongo.input.uri","mongodb://secondarydb.test.local/testdb.test?readPreference=secondary")
val sparkConf = new SparkConf().setMaster("local[5]")
val sc = new SparkContext(sparkConf)
val documents = sc.newAPIHadoopRDD(mongoConfig,classOf[MongoInputFormat],classOf[Object], classOf[BSONObject])
我确实添加了readPreference=secondary,但仍然得到以下异常:

Exception in thread "main" com.mongodb.MongoNotPrimaryException:
 The server is not the primary and did not execute the operation

您实际使用的IP地址是什么?我在连接字符串上没有看到replicaSet选项,这表示您正试图通过辅助节点的地址直接连接到该节点。不要那样做。而是使用辅助读取首选项连接到replicaSet。那就不是问题了。我正在使用辅助mongoDB ip。你的意思是我应该将ip设置为主数据库吗?我如何才能连接到复制?所有官方驱动程序或任何实现它们的驱动程序都有文档记录并保持一致。连接到副本集的典型方式是使用URI中带有“name”的选项以及分号
分离的“种子”主机列表。实际上,即使只有一个主机也足够了,因为驱动程序将“自动发现”成员。但是,通常建议在成员关闭时提供多个选项,除非存在该选项(以及您的
readPreference
),驱动程序将其解释为仅“单主机连接”。由于您连接到的节点“不是主节点”或从驱动程序的角度知道主节点,因此会出现错误。出于特殊管理目的,您只能“直接”连接到副本集中的单个主机。不适用于一般查询。您实际使用的IP地址是什么?我在连接字符串上没有看到replicaSet选项,这表示您正试图通过辅助节点的地址直接连接到该节点。不要那样做。而是使用辅助读取首选项连接到replicaSet。那就不是问题了。我正在使用辅助mongoDB ip。你的意思是我应该将ip设置为主数据库吗?我如何才能连接到复制?所有官方驱动程序或任何实现它们的驱动程序都有文档记录并保持一致。连接到副本集的典型方式是使用URI中带有“name”的选项以及分号
分离的“种子”主机列表。实际上,即使只有一个主机也足够了,因为驱动程序将“自动发现”成员。但是,通常建议在成员关闭时提供多个选项,除非存在该选项(以及您的
readPreference
),驱动程序将其解释为仅“单主机连接”。由于您连接到的节点“不是主节点”或从驱动程序的角度知道主节点,因此会出现错误。出于特殊管理目的,您只能“直接”连接到副本集中的单个主机。不适用于一般查询。