カフカの消費者相殺を決定するものは何ですか?


170

私はカフカに比較的新しいです。私はそれを少し実験しましたが、消費者オフセットに関していくつかのことが不明確です。私がこれまでに理解したことから、コンシューマーが開始するときに、読み取りを開始するオフセットは、構成設定によって決まりますauto.offset.reset(間違っている場合は訂正してください)。

たとえば、トピックに10個のメッセージ(オフセット0〜9)があり、コンシューマーがダウンする前(またはコンシューマーを強制終了する前)にたまたま5個消費したとします。次に、その消費者プロセスを再起動するとします。私の質問は:

  1. auto.offset.resetがに設定されている場合、smallest常にオフセット0から消費を開始しますか?

  2. auto.offset.resetがに設定されている場合、largestオフセット5から消費を開始しますか?

  3. この種のシナリオに関する動作は常に確定的ですか?

私の質問に不明な点がある場合は、遠慮なくコメントしてください。前もって感謝します。

回答:


260

あなたが説明したよりも少し複雑です。あなたのコンシューマ・グループは、有効なオフセットコミットどこかを持っていない場合にのみのconfigキックは(2サポートオフセットストレージは現在、カフカと飼育係です)、それはまた、ソート、消費者の使用によって異なります。
auto.offset.reset

高レベルのJavaコンシューマーを使用する場合は、以下のシナリオを想像してください。

  1. group15つのメッセージを消費して死亡したコンシューマーグループのコンシューマーがあります。次回このコンシューマーを起動すると、その構成も使用せずauto.offset.reset、格納されたオフセットをオフセットストレージ(前述のようにKafkaまたはZK)からフェッチするだけなので、そのコンシューマーは停止した場所から続行されます。

  2. (説明したように)トピックにメッセージがあり、新しいコンシューマーグループでコンシューマーを開始しますgroup2。オフセットはどこにも保存されておらず、今回auto.offset.resetは、構成はトピックの最初から開始するか(earliest)、トピックの最後から開始するか(latest)を決定します

対応した値をオフセットするものに影響もう一つearliestlatestのconfigsは、ログの保存方針です。保持が1時間に設定されたトピックがあるとします。5つのメッセージを作成し、1時間後にさらに5つのメッセージを投稿します。latestオフセットは、まだ前の例と同じままになりますが、earliest一つはなることはできません0カフカはすでにこれらのメッセージを削除するため、可能な最も古い相殺することからなります5

上記のすべては関連しておらずSimpleConsumer、実行するたびに、auto.offset.resetconfigの使用から開始する場所が決定されます。

あなたが0.9よりも古いカフカのバージョンを使用している場合は、交換する必要がありearliestlatestsmallestlargest


3
答えてくれてありがとう。したがって、高レベルの消費者に関しては、消費者が何かを(ZKまたはKafkaのいずれかで)コミットすると、auto.offset.resetその後は何の意味もありませんか?その設定の唯一の重要性は、何もコミットされていないときです(そして理想的には、それは消費者の最初の起動時になるでしょう)。
Asif Iqbal 2015

2
あなたは説明したとおりに
serejjaを

1
@serejjaこんにちは-グループごとに常に1つのコンシューマーがあり、あなたの答えのシナリオ1が私のために発生する場合はどうでしょうか?同じでしょうか?
ha9u63ar

1
@ ha9u63arはあなたの質問を完全に理解していませんでした。同じグループでコンシューマーを再起動すると、はい、使用されずauto.offset.reset、コミットされたオフセットから続行されます。常に異なるコンシューマグループを使用する場合(コンシューマの起動時に生成するなど)、コンシューマは常に尊重しますauto.offset.reset
serejja

@serejjaはい、それは私のために働いていません。あなたが見てみてください可能性があり、これを -これが私の問題です
ha9u63ar

83

単なる更新:Kafka 0.9以降では、Kafkaは新しいJavaバージョンのコンシューマーを使用しており、auto.offset.resetパラメーター名が変更されています。マニュアルから:

Kafkaに初期オフセットがない場合、または現在のオフセットがサーバーに存在しない場合(たとえば、そのデータが削除されているため)の対処方法:

最古:オフセットを最古のオフセットに自動的にリセットします

latest:オフセットを最新のオフセットに自動的にリセットします

none:コンシューマのグループに以前のオフセットが見つからない場合、コンシューマに例外をスローします

その他:コンシューマに例外をスローします。

私は受け入れられた回答を確認した後、これを見つけるのに少し時間を費やしたので、コミュニティがそれを投稿することは役立つかもしれないと思いました。


9

さらに、offsets.retention.minutesがあります。最後のコミットからの時間が>のoffsets.retention.minutes場合、auto.offset.resetまたキックします


1
これはログ保持と冗長に見えませんか?オフセット保持はログ保持に基づくべきですか?
mike01010

@ mike01010そうですね。これは、ログ保持に基づいている必要があります。これは、チケットで提案されているソリューションの1つです。Prolong default value of offsets.retention.minutes to be at least twice larger than log.retention.hours. issues.apache.org/jira/browse/KAFKA-3806
saheb

その答えは、次のドキュメントを確認するまでしばらくの間私を怖がらせましたoffsets.retention.minutes:<b>コンシューマグループがすべてのコンシューマを失った(つまり空になった)後、そのオフセットは破棄される前にこの保持期間保持されます。</ b>スタンドアロンの場合コンシューマ(手動割り当てを使用)の場合、オフセットは、最後のコミットの時刻にこの保持期間を加えた後に期限切れになります。(これはKafka 2.3
jumping_monkey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.