我正在开发一个需要从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中的说明设置了保留期限。但问题仍然存在。
答案 0 :(得分:1)
您的process
是DStream
管道的延续,其中无输出运算符可以在每个批处理间隔执行管道。
你可以&#34;看&#34;通过阅读count
operator的签名:
count(): DStream[Long]
返回一个新的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
。