我正在尝试使用Kafka Utils Api将数据从Kafka(0.10.0.0)消耗到Spark(1.6.0)流媒体应用程序
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, inputTopicsSet)
要求是将Offset Ranges 手动提交给Kafka本身。
意识到在java中使用KafkaConsumer(或Consumer)对象时,我们可以在设置" enable.auto.commit"之后使用commitAsync或commitSync方法实现此目的。 =" false" 在params。
使用KafkaUtils时,我无法找出执行相同操作的方法。
答案 0 :(得分:0)
你可以通过" enable.auto.commit" =" false"作为kafkaParams
的一部分。事实上,您可以将任何Kafka消费者设置作为其中的一部分。
Map<String, Object> kafkaParams = new HashMap<>();
kafkaParams.put("bootstrap.servers", "localhost:9092,anotherhost:9092");
kafkaParams.put("key.deserializer", StringDeserializer.class);
kafkaParams.put("value.deserializer", StringDeserializer.class);
kafkaParams.put("group.id", "use_a_separate_group_id_for_each_stream");
kafkaParams.put("enable.auto.commit", true);
//more kafka params goes here if needed
JavaInputDStream<ConsumerRecord<String, String>> stream =
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder](ssc, kafkaParams, inputTopicsSet)
然后像这样手动提交偏移量,
stream.foreachRDD(rdd -> {
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
// some time later, after outputs have completed
((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
});
参考:https://spark.apache.org/docs/2.2.0/streaming-kafka-0-10-integration.html#creating-a-direct-stream
以上代码适用于spark 2.2.0,可能不适用于spark 1.6.0。