Spark Streaming MQTT

时间:2015-07-01 22:39:36

标签: scala apache-spark mqtt spark-streaming

我一直在使用spark从kafka传输数据,这很容易。

我认为使用MQTT工具也很容易,但不是出于某种原因。

我正在尝试执行以下代码。

  val sparkConf = new SparkConf(true).setAppName("amqStream").setMaster("local")
  val ssc = new StreamingContext(sparkConf, Seconds(10))

  val actorSystem = ActorSystem()
  implicit val kafkaProducerActor = actorSystem.actorOf(Props[KafkaProducerActor])

  MQTTUtils.createStream(ssc, "tcp://localhost:1883", "AkkaTest")
    .foreachRDD { rdd =>
      println("got rdd: " + rdd.toString())
      rdd.foreach { msg =>
        println("got msg: " + msg)
      }
    }

  ssc.start()
  ssc.awaitTermination()

奇怪的是,spark会记录我在控制台中发送的消息,但不记录我的println。

它记录的内容如下:

  

19:38:18.803 [RecurringTimer - BlockGenerator] DEBUG   o.a.s.s.receiver.BlockGenerator - 最后一个元素   输入-0-1435790298600是SOME MESSAGE

2 个答案:

答案 0 :(得分:3)

foreach是一个分布式操作,因此您的println可能正在对worker执行。如果你想看到一些本地打印的消息,你可以在DStream上使用内置的print函数,或者代替你的foreachRDD将一些元素收集(或取出)给驱动程序并在那里打印。希望对Spark Streaming有帮助并祝你好运:)

答案 1 :(得分:0)

如果您只想打印收到的消息,请尝试使用类似这样的内容而不是for_each(从正在运行的Python版本进行翻译,请检查Scala拼写错误):

val mqttStream = MQTTUtils.createStream(ssc, "tcp://localhost:1883", "AkkaTest")
mqttStream.print()