我是 Spark流媒体的新手,我正在实施一些小练习,例如从 kafka 发送 XML 数据并需要接收流数据通过火花流。我尝试了所有可能的方式..但每次我得到空值。
Kafka 方面没有问题,只有问题是从Spark端接收流数据。
以下是我正在实施的代码:
package com.package;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.streaming.Duration;
import org.apache.spark.streaming.api.java.JavaStreamingContext;
public class SparkStringConsumer {
public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setAppName("kafka-sandbox")
.setMaster("local[*]");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaStreamingContext ssc = new JavaStreamingContext(sc, new Duration(2000));
Map<String, String> kafkaParams = new HashMap<>();
kafkaParams.put("metadata.broker.list", "localhost:9092");
Set<String> topics = Collections.singleton("mytopic");
JavaPairInputDStream<String, String> directKafkaStream = KafkaUtils.createDirectStream(ssc,
String.class, String.class, StringDecoder.class, StringDecoder.class, kafkaParams, topics);
directKafkaStream.foreachRDD(rdd -> {
System.out.println("--- New RDD with " + rdd.partitions().size()
+ " partitions and " + rdd.count() + " records");
rdd.foreach(record -> System.out.println(record._2));
});
ssc.start();
ssc.awaitTermination();
}
}
我正在使用以下版本:
** Zookeeper 3.4.6
Scala 2.11
Spark 2.0
卡夫卡0.8.2 **
答案 0 :(得分:1)
你可以这样:
directKafkaStream.foreachRDD(rdd ->{
rdd.foreachPartition(item ->{
while (item.hasNext()) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>"+item.next());
}
}
});
itme.next()包含键值对。你可以通过使用获得价值 item.next()._ 2
答案 1 :(得分:0)
你的火花流应用程序看起来不错。我测试了它,它正在打印kafka消息。您也可以尝试以下&#34;收到消息&#34; print语句来验证kafka消息。
directKafkaStream.foreachRDD(rdd -> {
System.out.println("Message Received "+rdd.values().take(5));
System.out.println("--- New RDD with " + rdd.partitions().size()
+ " partitions and " + rdd.count() + " records");
rdd.foreach(record -> System.out.println(record._2));
});
如果您正在使用Zookeeper,那么也将其设置为kafka param
kafkaParams.put("zookeeper.connect","localhost:2181");
在导入语句之后,我没有在你的程序中看到这样添加。
import org.apache.spark.streaming.kafka.KafkaUtils;
import kafka.serializer.StringDecoder;
请同时验证您是否可以使用主题&#34; mytopic&#34;使用命令行kafka-console-consumer。