来自卡夫卡的火花流的空值

时间:2016-04-27 11:18:28

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

我有一个简单的程序,因为我正在尝试使用kafka接收数据。当我启动一个kafka生产者并发送数据时,例如:“Hello”,当我打印消息时,我得到了这个:(null, Hello)。我不知道为什么会出现这个空值。有没有办法避免这个null?我认为这是由于Tuple2<String, String>,第一个参数,但我只想打印第二个参数。另一件事,当我使用System.out.println("inside map "+ message);打印它时,它没有显示任何消息,有人知道为什么吗?感谢。

public static void main(String[] args){

    SparkConf sparkConf = new SparkConf().setAppName("org.kakfa.spark.ConsumerData").setMaster("local[4]");
    // Substitute 127.0.0.1 with the actual address of your Spark Master (or use "local" to run in local mode
    sparkConf.set("spark.cassandra.connection.host", "127.0.0.1");
    // Create the context with 2 seconds batch size
    JavaStreamingContext jssc = new JavaStreamingContext(sparkConf, new Duration(2000));

    Map<String, Integer> topicMap = new HashMap<>();
    String[] topics = KafkaProperties.TOPIC.split(",");
    for (String topic: topics) {
        topicMap.put(topic, KafkaProperties.NUM_THREADS);
    }
    /* connection to cassandra */
    CassandraConnector connector = CassandraConnector.apply(sparkConf);
    System.out.println("+++++++++++ cassandra connector created ++++++++++++++++++++++++++++");

    /* Receive kafka inputs */
    JavaPairReceiverInputDStream<String, String> messages =
            KafkaUtils.createStream(jssc, KafkaProperties.ZOOKEEPER, KafkaProperties.GROUP_CONSUMER, topicMap);
    System.out.println("+++++++++++++ streaming-kafka connection done +++++++++++++++++++++++++++");

    JavaDStream<String> lines = messages.map(
            new Function<Tuple2<String, String>, String>() {
                public String call(Tuple2<String, String> message) {
                    System.out.println("inside map "+ message);
                    return message._2();
                }
            }
    );

    messages.print();
    jssc.start();
    jssc.awaitTermination();
}

1 个答案:

答案 0 :(得分:0)

Q1)空值: Kafka中的消息是Keyed,这意味着它们都具有(Key,Value)结构。 当您看到(null, Hello)是因为制作人在主题中发布了(null,"Hello")值。 如果您想在流程中省略密钥,请映射原始Dtream以删除密钥:kafkaDStream.map( new Function<String,String>() {...})

Q2)System.out.println("inside map "+ message);无法打印。几个经典的原因:

  1. 转换应用于执行程序中,因此在群集中运行时,该输出将出现在执行程序中而不是主程序中。

  2. 操作很懒惰,需要实现DStream才能应用操作。

  3. 在这种特定情况下,JavaDStream<String> lines从未实现,即不用于输出操作。因此,永远不会执行map