将Scala Spark Streaming数据保存到MongoDB

时间:2016-12-17 16:33:21

标签: mongodb scala apache-spark spark-streaming

这是我简化的Apache Spark Streaming代码,它通过Kafka Streams获取输入,组合,打印并将它们保存到文件中。但现在我希望将传入的数据流保存在MongoDB中。

val conf = new SparkConf().setMaster("local[*]")
                          .setAppName("StreamingDataToMongoDB")
                          .set("spark.streaming.concurrentJobs", "2")

val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val ssc = new StreamingContext(sc, Seconds(1))

val kafkaParams = Map("metadata.broker.list" -> "localhost:9092")
val topicName1 = List("KafkaSimple").toSet
val topicName2 = List("SimpleKafka").toSet

val stream1 = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicName1)
val stream2 = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicName2)

val lines1 = stream1.map(_._2)
val lines2 = stream2.map(_._2)

val allThelines = lines1.union(lines2)
allThelines.print()
allThelines.repartition(1).saveAsTextFiles("File", "AllTheLinesCombined")

我已经尝试过Stratio Spark-MongoDB库和其他一些资源,但仍然没有成功。有人请帮我继续或重定向到一些有用的工作资源/教程。干杯:)

2 个答案:

答案 0 :(得分:0)

如果您希望写出DStreams不直接支持的格式,可以使用foreachRDD使用基于RDD的Mongo API逐个写出每个批次。

答案 1 :(得分:0)

lines1.foreachRDD ( rdd => {
      rdd.foreach( data =>
        if (data != null) {

            // Save data here

        } else {

          println("Got no data in this window")

        }
      )
    })

对第2行也这样做。