Scala 火花流MQTT

Scala 火花流MQTT,scala,apache-spark,mqtt,spark-streaming,Scala,Apache Spark,Mqtt,Spark Streaming,我一直在使用spark从卡夫卡传输数据,这非常简单 我认为使用MQTT UTIL也很容易,但这不是出于某种原因 我正在尝试执行下面的代码 val sparkConf = new SparkConf(true).setAppName("amqStream").setMaster("local") val ssc = new StreamingContext(sparkConf, Seconds(10)) val actorSystem = ActorSystem() implic

我一直在使用spark从卡夫卡传输数据,这非常简单

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

我正在尝试执行下面的代码

  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[循环计时器-块生成器]调试 o、 a.s.s.receiver.BlockGenerator-中的最后一个元素 输入-0-1435790298600是一些消息


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

如果您只想打印传入的消息,请尝试这样的方法,而不是使用for_(从工作的Python版本翻译,所以一定要检查Scala打字错误):


我刚刚意识到我的问题在于MQTT流。使用Kafka Stream,我甚至可以使用.master(“local”)运行嵌入式spark版本并调试我的应用程序。运行MQTT流,我无法测试它。在集群节点中测试,它可以工作=(如果要在本地模式下运行,请尝试使用“local[4]”主控键,以便接收器和其他设备也可以运行。
val mqttStream = MQTTUtils.createStream(ssc, "tcp://localhost:1883", "AkkaTest")
mqttStream.print()