为什么我的Spark Streaming应用程序不打印来自Kafka的记录数(使用count运算符)?

时间:2016-11-28 23:20:37

标签: apache-spark apache-kafka spark-streaming

我正在开发一个需要从Kafka读取数据的spark应用程序。我创建了一个Kafka主题,其中制作人正在发布消息。我从控制台消费者验证消息已成功发布。

我写了一个简短的spark应用程序来读取Kafka的数据,但它没有得到任何数据。 以下是我使用的代码:

JDialog dialog = new JDialog();
JPanel main = new JPanel();
main.setLayout(new BoxLayout(main, BoxLayout.Y_AXIS));
JPanel tabPanel = new JPanel();
JTabbedPane tabPane = new JTabbedPane();

for (int i = 0; i < 5; i++) {
     tabPane.addTab("Test" + i, new JPanel());
     System.out.println(tabPane.getPreferredSize().height);
}  

tabPanel.add(tabPane, BorderLayout.NORTH);

main.add(tabPanel, BorderLayout.CENTER);

dialog.add(main);

dialog.setPreferredSize(new Dimension(50, 100);
dialog.pack();
dialog.setVisible(true);

有关如何解决此问题的任何建议?

****** **** EDIT

我用过

def main(args: Array[String]): Unit = {
   val Array(zkQuorum, group, topics, numThreads) = args
   val sparkConf = new SparkConf().setAppName("SparkConsumer").setMaster("local[2]")
   val ssc = new StreamingContext(sparkConf, Seconds(2))

   val topicMap = topics.split(",").map((_, numThreads.toInt)).toMap
   val lines = KafkaUtils.createStream(ssc, zkQuorum, group, topicMap).map(_._2)

   process(lines) // prints the number of records in Kafka topic

   ssc.start()
   ssc.awaitTermination()
 }

 private def process(lines: DStream[String]) { 
   val z = lines.count()
   println("count of lines is "+z) 
    //edit
   lines.foreachRDD(rdd => rdd.map(println) 
   // <-- Why does this **not** print?
 )

以及实际代码,但也无效。我按照帖子Kafka spark directStream can not get data中的说明设置了保留期限。但问题仍然存在。

1 个答案:

答案 0 :(得分:1)

您的processDStream管道的延续,其中输出运算符可以在每个批处理间隔执行管道。

你可以&#34;看&#34;通过阅读count operator的签名:

count(): DStream[Long]

引用count's scaladoc

  

返回一个新的DStream,其中每个RDD都有一个通过计算此DStream的每个RDD生成的单个元素。

因此,您有一个Kafka记录的dstream,您可以转换为单个值的dstream(由count生成)。将它输出(到控制台或任何其他接收器)并不多。

您必须使用官方文档Output Operations on DStreams中所述的输出运算符来结束管道:

  

输出操作允许将DStream的数据推送到外部系统,如数据库或文件系统。由于输出操作实际上允许外部系统使用转换后的数据,因此它们会触发所有DStream转换的实际执行(类似于RDD的操作)。

(低级)输出操作符将输入dstream注册为输出dstream,以便可以开始执行。 Spark Streaming&#39; s DStream没有设计成输出dstream的概念。知道并能够区分输入和输出dstream是DStreamGraph