Hadoop 接收kafka 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;

我是Spark streaming的新手,我正在实施一些小练习,比如从kafka发送XML数据,并需要通过Spark streaming接收数据流。我尝试了所有可能的方法。。但每次我都得到空值。

卡夫卡方面没有问题,唯一的问题是从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();
    }
}
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()。_2

Hello@abaghel,感谢您的快速回复。我像你说的那样尝试了,仍然收到了空消息…下面是消息:message Received[]---新的RDD,带有1个分区和0个记录ID您是否尝试kafka console consumer?你们能看到那个里的留言吗?很有趣。你能分享你的pom.xml吗?你能分享你的电子邮件id吗?我会把我的pom.xml文件粘贴在这里……或者这是我的邮件idcontacteedupuganti@gmail.com你可以在这个mailid上留言……让我们。