簡體   English   中英

如何使用Spark的Kafka直接流設置消費者群體提交的偏移量?

[英]How to set offset committed by the consumer group using Spark's Direct Stream for Kafka?

我正在嘗試使用Spark的直接方法(無接收器)用於Kafka ,我有以下Kafka配置圖:

configMap.put("zookeeper.connect","192.168.51.98:2181");
configMap.put("group.id", UUID.randomUUID().toString());
configMap.put("auto.offset.reset","smallest");
configMap.put("auto.commit.enable","true");
configMap.put("topics","IPDR31");
configMap.put("kafka.consumer.id","kafkasparkuser");
configMap.put("bootstrap.servers","192.168.50.124:9092");

現在我的目標是,如果我的Spark管道崩潰並再次啟動,則應該從使用者組提交的最新偏移量開始流。 因此,為此目的,我想為消費者指定起始偏移量。 我有關於每個分區中提交的偏移量的信息。 我如何將此信息提供給流功能。 目前我正在使用

JavaPairInputDStream<byte[], byte[]> kafkaData =
   KafkaUtils.createDirectStream(js, byte[].class, byte[].class,
     DefaultDecoder.class, DefaultDecoder.class,configMap,topic); 

Spark API文檔中查看createDirectStream的第二種形式 - 它允許您傳入Map<TopicAndPartition, Long> ,其中Long是偏移量。

請注意,使用DirectInputStream時,Spark不會自動更新Zookeeper中的偏移量 - 您必須自己將它們寫入ZK或其他數據庫。 除非您嚴格要求完全一次語義,否則使用createStream方法更容易獲取DStream,在這種情況下,Spark將更新ZK中的偏移量,並在發生故障時從最后存儲的偏移量中恢復。

根據您的要求,正確的解決方案是使用檢查點。 對於每個已處理的RDDStream,檢查點都會將元數據寫入指定的共享存儲(通常為hdfs)。 它的元數據,而不是真實的數據,所以沒有真正的性能影響。

如果火花過程崩潰並重新啟動,它將首先讀取檢查點並從檢查點保存的偏移量中恢復。

你可以參考我使用spark streaming的示例代碼,使用checkpoint將數據寫入elasticsearch。 https://github.com/atulsm/Test_Projects/blob/master/src/spark/StreamingKafkaRecoverableDirectEvent.java

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM