卡夫卡 - > Spark Stream - 如何将消息拆分为Spark Receiver上的记录?

时间:2015-07-09 14:08:00

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

欣赏如果你能对这个问题有所了解。 我正在写一个Spark流接收器来消费来自Kafka的消息。我收到了一块很好的消息。我正在使用新行分隔符拆分消息块以创建新的DSTream“msgLines”(附加了代码片段)。现在我想循环遍历每行的“msgLines”DStream以获取该消息记录(行)来处理它。

怎么做?请问任何示例代码?

非常感谢

  JavaPairDStream<String, String> messages = KafkaUtils.createStream(sc, zkQuorum, group, topicMap);
    //
    JavaDStream<String> msgBlock = messages.map(new Function<Tuple2<String, String>, String>() {
      @Override
      public String call(Tuple2<String, String> tuple2) {
        return tuple2._2();
      }
    });


    //
    JavaDStream<String> msgLines = msgBlock.flatMap(new FlatMapFunction <String, String>(){
        @Override
        public Iterable<String> call(String x) {
          return Lists.newArrayList(SPACE.split("\n"));
        }
    });

1 个答案:

答案 0 :(得分:0)

您可以在下面执行以下操作。在这里,我只是在控制台上打印消息,而不是将它们存储在任何外部存储中。

 msgLines.foreachRDD(new VoidFunction<JavaRDD<String>>() {

        private static final long serialVersionUID = -2185091572028321496L;

        @Override
        public void call(JavaRDD<String> rdd) throws Exception {

            rdd.foreachPartition(new VoidFunction<Iterator<String>>() {

                @Override
                public void call(Iterator<String> msgs) throws Exception {
                    while(msgs.hasNext())
                        System.out.println(msgs.next());
                }
            });
        }
    });