私は次のように使用してカフカにジョブをストリーミング私のスパークからのオフセットをコミットしようとしています:
OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
// some time later, after outputs have completed
((CanCommitOffsets) stream.inputDStream()).commitAsync(offsetRanges);
私はこの質問から得たとして:
そして、この作品の罰金は、オフセットがコミットされています。しかし、問題は、この後でさえ、さらに2つのオフセットのコミットはラインの下の送信された手段は、カフカはまだ前にオフセット2つのコミットを保持可能性がある、非同期であるということです。消費者がその時点でクラッシュし、私はそれをバックアップする持っている場合、それはすでに処理されたメッセージを読み始めます。
さて、他のソースから、ここでコメント欄のように:
https://dzone.com/articles/kafka-clients-at-most-once-at-least-once-exactly-o
私は、仕事をストリーミングスパークから同期オフセットをコミットする方法はありませんことを理解(私はカフカストリーム使う場合は、1つがあるが)。人々は、むしろあなたがストリームにあなたの計算の最終結果を永続化されているデータベースでオフセットを維持することをお勧めします。
さて、私の質問はこれです:もしI DOストア現在、私のデータベースにオフセット読み、どのように私は次の時間をオフセットすることを正確にからのストリームを読み始めるのですか?
私が研究し、私の質問への答えを見つけたので、私は同じ問題に直面するかもしれない他の誰のためにそれをここに掲示しています:
値としてキーとロングようorg.apache.kafka.common.TopicPartitionとのMapオブジェクトを作成します。TopicPartitionコンストラクタは二つの引数、トピック名とあなたが読んで元となるパーティションをとります。Mapオブジェクトの値は、ストリームを読みたい、そこからのオフセットの長い表現です。
地図startingOffset =新しいHashMapの<>(); startingOffset.put(新TopicPartition( "TOPIC_NAME"、0)、3332980L)。
適切なJavaInputStreamにストリームの内容を読み、ConsumerStrategies.Subscribe()メソッドの引数として、以前に作成したMapオブジェクトを提供します。
最終JavaInputDStream>ストリーム= KafkaUtils.createDirectStream(JSSC、LocationStrategies.PreferConsistent()、ConsumerStrategies.Subscribe(トピック、kafkaParams、startingOffset))。