Hadoop 接收kafka Spark流时获取空值
我是Spark streaming的新手,我正在实施一些小练习,比如从kafka发送XML数据,并需要通过Spark streaming接收数据流。我尝试了所有可能的方法。。但每次我都得到空值。 卡夫卡方面没有问题,唯一的问题是从Spark方面接收流式数据。 以下是我如何实现的代码:Hadoop 接收kafka Spark流时获取空值,hadoop,apache-spark,streaming,apache-kafka,spark-streaming,Hadoop,Apache Spark,Streaming,Apache Kafka,Spark Streaming,我是Spark streaming的新手,我正在实施一些小练习,比如从kafka发送XML数据,并需要通过Spark streaming接收数据流。我尝试了所有可能的方法。。但每次我都得到空值。 卡夫卡方面没有问题,唯一的问题是从Spark方面接收流式数据。 以下是我如何实现的代码: package com.package; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext;
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();
}
}
package.com.package;
导入org.apache.spark.SparkConf;
导入org.apache.spark.api.java.JavaSparkContext;
导入org.apache.spark.streaming.Duration;
导入org.apache.spark.streaming.api.java.JavaStreamingContext;
公共类SparkStringConsumer{
公共静态void main(字符串[]args){
SparkConf conf=新的SparkConf()
.setAppName(“卡夫卡沙盒”)
.setMaster(“本地[*]”);
JavaSparkContext sc=新的JavaSparkContext(conf);
JavaStreamingContext ssc=新的JavaStreamingContext(sc,新的持续时间(2000));
Map kafkaParams=新HashMap();
kafkaParams.put(“metadata.broker.list”,“localhost:9092”);
Set topics=Collections.singleton(“mytopic”);
JavaPairInputStream 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()
+“分区和”+rdd.count()+“记录”);
rdd.foreach(记录->系统输出.println(记录._2));
});
ssc.start();
ssc.终止();
}
}
我正在使用以下版本:
**动物园管理员3.4.6
Scala 2.11
火花2.0
Kafka 0.8.2**您的spark流媒体应用程序看起来不错。我测试了它,它正在打印卡夫卡的信息。您还可以尝试在下面的“Message Received”打印语句中验证卡夫卡消息
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;
还请验证是否可以使用命令行kafka console consumer使用主题“mytopic”上的消息。您可以这样:
directKafkaStream.foreachRDD(rdd ->{
rdd.foreachPartition(item ->{
while (item.hasNext()) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>"+item.next());
}
}
});
next()包含键值对。您可以通过使用
item.next()。_2Hello@abaghel,感谢您的快速回复。我像你说的那样尝试了,仍然收到了空消息…下面是消息:message Received[]---新的RDD,带有1个分区和0个记录ID您是否尝试kafka console consumer?你们能看到那个里的留言吗?很有趣。你能分享你的pom.xml吗?你能分享你的电子邮件id吗?我会把我的pom.xml文件粘贴在这里……或者这是我的邮件idcontacteedupuganti@gmail.com你可以在这个mailid上留言……让我们。