使用KafkaUtils.createDirectStream时,手动将offsetRanges提交给Kafka

时间:2017-11-30 04:44:55

标签: apache-kafka spark-streaming

我正在尝试使用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时,我无法找出执行相同操作的方法。

1 个答案:

答案 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。