【问题标题】:How does one import the BSON object successfully in a Zeppelin notebook?如何在 Zeppelin 笔记本中成功导入 BSON 对象?
【发布时间】:2016-05-26 17:57:32
【问题描述】:

有谁知道在通过 Zeppelin 笔记本调用 MongoDB 实例时如何解决以下 BSON 对象错误?

“错误:对象 bson 不是包 org import org.bson.BSONObject 的成员”

我专门通过 Azure 中的 Spark 集群来实现 notebook,代码在 Scala 中。我正在使用超级罐“mongo-java-driver-3.2.1.jar”。我也尝试过使用单独的三个必需的 jar 以及它们的各种版本并收到相同的错误。

这是我在笔记本中执行的代码减去 mongo 实例的实际 IP 地址。

z.load("C:\\mongojar\\mongo-java-driver-3.2.1.jar")

import org.apache.hadoop.conf.Configuration
import org.bson.BSONObject
import org.bson.BasicBSONObject

val config = new Configuration()
config.set("mongo.input.uri", "mongodb://xxx.xxx.xx.xxx:27017   
/marketdata.minibars")
config.set("mongo.job.input.format",    
"com.mongodb.hadoop.MongoInputFormat")

val mongoRDD = sc.newAPIHadoopRDD(config,     
classOf[com.mongodb.hadoop.MongoInputFormat], classOf[Object], 
classOf[BSONObject])

mongoRDD.first()

【问题讨论】:

    标签: mongodb apache-spark bson apache-zeppelin


    【解决方案1】:

    可能是加载 jar 失败。 试试这个:

    z.load("org.mongodb:bson:3.2.1").
    

    SparkContext也可能需要它(如果它必须分布在集群上),所以你也应该尝试:

    z.loadAndDist("org.mongodb:bson:3.2.1")
    

    我刚查了一下,最新版的包没有org.bson.BSONObjectorg.bson.BasicBSONObject这两个类了。您可以通过更改版本代码恢复到旧版本,例如 2.3,或者更改您的代码以符合最新版本。 Documentation can be found here.

    【讨论】:

    • 我收到一个关于 loadAndDist 的新错误。 “值 loadAndDist 不是 org.apache.zeppelin.spark.ZeppelinContext 的成员”。我也尝试了 z.load("org.mongodb:bson:3.2.1") 并且没有出现新的错误。我在没有导入 org.bson.BSONObject 的情况下运行它,它导致以下成功消息 res340:Iterable[String] = Wrappers(org.mongodb:bson:3.2.1, org.slf4j:slf4j-api:1.7.6) .
    • 那条特定的行似乎有效。代码仍然会产生“错误:对象 BSONObject 不是包 org.bson 的成员”,但是当它被引用时。有点疑惑……
    • 我刚刚用一个有希望的解决方案编辑了我的问题。
    • 我现在正在研究 Daniel Zolnai,如果可行,我会分享。昨晚我开始简要地翻阅文档,看看是否也发生了一些变化,但你发现了它。谢谢。
    • 不幸的是,根据api.mongodb.org/java/2.3 的文档,在恢复到包含 BSONObject 的 2.3 等旧版本后,错误仍然存​​在。因此,最终的答案似乎是为新版本重构代码,尽管到目前为止的文档并没有透露它的任何秘密。使用 Spark 似乎 95% 尝试配置连接,5% 处理您尝试解决的问题。
    【解决方案2】:

    MongoDB 支持确认有问题的 jar 是正确的,并且有必要的对象。我与 Microsoft 进行了交谈,结果证明这确实是 Zeppelin 的问题。

    Zeppelin 不再是推荐的解决方案,而是推荐 Jupyter notebook 以供未来努力,但它还没有准备好支持我正在尝试的东西。因此,Microsoft 已经能够使用 sbt 和 fat jar 演示 BSON 对象的导入,然后使用 spark-submit 提交作业。

    import org.apache.hadoop.conf.Configuration
    import org.apache.spark.{SparkContext, SparkConf}
    import org.apache.spark.rdd.RDD
    import org.bson.BSONObject
    import org.bson.BasicBSONObject
    import com.mongodb.hadoop.MongoInputFormat
    
    
    object MongoTest {
    
      def main(args: Array[String]) {
    
      val config = new Configuration()
      config.set("mongo.input.uri", "mongodb://xxx.xxx.xx.xxx:27017/marketdata.minibars")
      config.set("mongo.job.input.format", "com.mongodb.hadoop.MongoInputFormat")
    
      val sparkConf = new SparkConf().setAppName("MongoTest")
      val sc = new SparkContext(sparkConf)  
    
      val mongoRDD = sc.newAPIHadoopRDD(config, classOf[com.mongodb.hadoop.MongoInputFormat], classOf[Object], classOf[BSONObject])    
      mongoRDD.first()
    
    
      sc.stop()
    }
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2018-11-01
      • 1970-01-01
      • 2016-12-25
      • 2020-05-16
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多