kafka muliple主题分离火花

时间:2016-05-30 11:51:09

标签: apache-spark apache-kafka kafka-consumer-api

我正在从kafka中读取来自2个不同主题的2个不同文件的行。线条示例:

例如: File1:2015-04-15T18:44:14+01:00,192.168.11.42,%ASA-2-106007:
File2:"04/15/2012","18:44:14",,"Start","Unknown","Unknown",,"192.168.63.128","444","2","7","192.168.63.128",,,,,,,,,,,,,,,,,

我可以从两个不同主题的spark中读取。代码如下:

SparkConf sparkConfig = new SparkConf().setAppName("KafkaStreaming").setMaster("local[5]");
        JavaStreamingContext jsc = new JavaStreamingContext(sparkConfig,Durations.seconds(5));
        final HiveContext sqlContext = new HiveContext(jsc.sc());
        JavaPairReceiverInputDStream<String, String> messages = KafkaUtils.createStream(jsc, 
                                                                                        prop.getProperty("zookeeper.connect"),
                                                                                        prop.getProperty("group.id"), 
                                                                                        topicMap
                                                                                        );

        JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {

                    private static final long serialVersionUID = 1L;

                    public String call(Tuple2<String, String> tuple2) {
                        return tuple2._2();
                    }
                });

我现在看到的问题是:

rdd包含明显的行。如何隔离或找出哪个记录​​来自哪个主题或哪个文件。
这背后的原因是我想为不同的主题应用不同的逻辑,这是火花。但是rdd在时间上有所有行

感谢任何建议

1 个答案:

答案 0 :(得分:1)

您必须选择createDirectStream重载方法,该方法接受scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler作为参数。比,你只需要传递一个函数messageHandler - 获取一个MessageAndMetadata对象作为输入 - 返回实际的消息和主题。

在这里,我向您发送用Scala编写的代码。您可以轻松地在Java中进行调整:

KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, (String,String)](ssc, 
        kafkaParams, 
        topicOffsetsMap, 
        (m:MessageAndMetadata[String, String])=> (m.topic,m.message()) 
        )