我一直在使用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
答案 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()