首頁  >  問答  >  主體

mongodb - spark叢集中每個節點都有一個獨立資料庫,可以實現分散式統計計算嗎?

我將spark搭建在兩台機器上,其中一台即是master又是slave,另一台是slave,兩台機器上均裝有獨立的mongodb資料庫。我的主程式讓它們統計自身資料庫的內容,然後將結果匯總到一台伺服器上的資料庫。目前程式碼是在master節點上提交的。但是我spark-submit之後,好像只統計master節點上的mongodb裡的資料了,另一個worker節點沒有統計。請問這是什麼原因?程式碼如下:

val conf = new SparkConf().setAppName("Scala Word Count")
val sc = new SparkContext(conf)

val config = new Configuration()

//以下代码表示只统计本机数据库上的数据,猜测问题可能出在这里
config.set("mongo.input.uri", "mongodb://127.0.0.1:27017/local.test")
//统计结果输出到服务器上
config.set("mongo.output.uri", "mongodb://103.25.23.80:60013/test_hao.result")

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

// Input contains tuples of (ObjectId, BSONObject)
val countsRDD = mongoRDD.flatMap(arg => {
  var str = arg._2.get("type").toString
  str = str.toLowerCase().replaceAll("[.,!?\n]", " ")
  str.split(" ")
})
.map(word => (word, 1))
.reduceByKey((a, b) => a + b)

// Output contains tuples of (null, BSONObject) - ObjectId will be generated by Mongo driver if null
val saveRDD = countsRDD.map((tuple) => {
  var bson = new BasicBSONObject()
  bson.put("word", tuple._1)
  bson.put("count", tuple._2.toString() )
  (null, bson)
})

// Only MongoOutputFormat and config are relevant
saveRDD.saveAsNewAPIHadoopFile("file:///bogus", classOf[Any], classOf[Any], classOf[com.mongodb.hadoop.MongoOutputFormat[Any, Any]], config)
天蓬老师天蓬老师2706 天前640

全部回覆(1)我來回復

  • PHP中文网

    PHP中文网2017-04-28 09:06:12

    自問自答。原因可能是這樣:

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

    這行程式碼表示這是由driver讀取資料庫,然後將符合條件的資料載入RDD,由於先前設定了是將127.0.0.1作為輸入,也就是從driver的mongodb上讀取資料。由於driver就在master上,所以讀取的資料也自然就是master上的資料了。

    回覆
    0
  • 取消回覆