从kafka Spark流式传输接收时获取空值

时间:2016-09-18 03:16:07

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

我是 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 **

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。