我编写了一个火花流应用程序,通过使用KafkaUtils从Kafka接收数据,我想要的是打印出我从Kafka收到的数据。这是我的代码(我使用spark-submit来执行我的spark流程作业):
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
messages.print()
当我运行它时,它工作得很好。如果输入是Kafka生产者中的a,b,c,我可以从Spark流式获取结果如下:
Time: 1476481700000 ms
-------------------------------------------
(null,a)
(null,b)
(null,c)
但如果我添加一行来计算行数,messages.print()
就无法工作。代码如下所示:
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
messages.print()
messages.count().print()
我得到以下结果:
-------------------------------------------
Time: 1476481800000 ms
-------------------------------------------
4
只有计数打印出来,数据无法打印出来。
我的问题是,在添加messages.print()
后,为什么messages.count.print()
不会被执行
另一个问题是元组(null, a)(null, b)(null, c)
中的null代表什么。
答案 0 :(得分:1)
print()没有问题,它会打印两条消息并计算如下。滚动并查看您的日志。
-------------------------------------------
Time: 1476481700000 ms
-------------------------------------------
(null,a)
(null,b)
(null,c)
-------------------------------------------
Time: 1476481800000 ms
-------------------------------------------
4
KafkaUtils.createDirectStream方法返回<Kafka topic, Kafka message>
的DStream。检查this和this与主题相关的帖子为空。
答案 1 :(得分:1)
您的代码应该正常工作,但是给您一个替代方案。但这种方法仅用于测试或学习。您可以使用单个actions
action
val messages = KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, topicSet)
//Cache your RDD before you perform any heavyweight operations.
messages.cache()
val result = messages.collect();
println(result.size + " size")
result.foreach { input => println(input) }