在火花流中将RDD打印到控制台

时间:2016-10-14 22:19:11

标签: apache-spark spark-streaming rdd

我编写了一个火花流应用程序,通过使用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代表什么。

2 个答案:

答案 0 :(得分:1)

print()没有问题,它会打印两条消息并计算如下。滚动并查看您的日志。

-------------------------------------------
Time: 1476481700000 ms
-------------------------------------------
(null,a)
(null,b)
(null,c)

-------------------------------------------
Time: 1476481800000 ms
-------------------------------------------
4

KafkaUtils.createDirectStream方法返回<Kafka topic, Kafka message>的DStream。检查thisthis与主题相关的帖子为空。

答案 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) }