web-dev-qa-db-ja.com

Kafkaの古いオフセットポイントからデータを取得する方法は?

Zookeeperを使用して、kafkaからデータを取得しています。そして、ここでは常に最後のオフセットポイントからデータを取得します。古いデータを取得するオフセットの時間を指定する方法はありますか?

1つのオプションautooffset.resetがあります。最小または最大を受け入れます。誰かが最小値と最大値を説明してください。 autooffset.resetは、最新のオフセットポイントではなく古いオフセットポイントからデータを取得するのに役立ちますか?

36
Sourabh

コンシューマは常にグループに属し、パーティションごとに、Zookeeperはパーティション内のそのコンシューマグループの進捗状況を追跡します。

最初から取得するには、フセインが参照した進行状況に関連するすべてのデータを削除できます

ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");

Core/src/main/scala/kafka/tools/UpdateOffsetsInZK.scalaで指定されているように、必要なパーティションのオフセットを指定することもできます

ZkUtils.updatePersistentPath(zkClient, topicDirs.consumerOffsetDir + "/" + partition, offset.toString)

ただし、オフセットには時間インデックスが付けられていませんが、パーティションごとにシーケンスがわかっています。

メッセージにタイムスタンプが含まれている場合(およびこのタイムスタンプがKafkaメッセージを受信した瞬間)とは関係ないことに注意してください)、次の手順で1つのエントリを取得しようとするインデクサーを実行できます。オフセットをN増やし、タプル(トピックX、パート2、オフセット100、タイムスタンプ)をどこかに保存します。

指定した瞬間からエントリを取得する場合、必要なエントリを見つけてそこから取得するまで、大まかなインデックスにバイナリ検索を適用できます。

24
Alex Rodrigues

「Kafka documentation .OffsetRequest.LatestTime()は新しいメッセージのみをストリーミングします。メッセージは時間の経過とともにログから期限切れになるため、オフセット0が開始オフセットであると想定しないでください。

ここでSimpleConsumerExampleを使用します。 https://cwiki.Apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example

同様の質問: Kafka高レベルコンシューマはJava API(--from-beginningと同等))を使用してトピックからすべてのメッセージを取得します

これは役立つかもしれません

8
Hild

オフセットパラメータの最小値と最大値のクエリについては、kafka config: http://kafka.Apache.org/08/configuration.html に関するドキュメントを参照してください。

ところで、カフカを探索している間、私は消費者にすべてのメッセージを再生する方法を疑問に思っていました。消費者グループがすべてのメッセージをポーリングし、それらを再取得したい場合。

それを実現する方法は、zookeeperからデータを削除することです。 kafka.utils.ZkUtilsクラスを使用して、zookeeper上のノードを削除します。以下はその使用法です。

ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");
3
Hussain Pirosha

今のところ

Kafka FAQこの問題に対する答えを与えてください。

OffsetRequestを使用して特定のタイムスタンプのメッセージのオフセットを正確に取得するにはどうすればよいですか?

Kafkaでは、時間ごとにメッセージのオフセットを照会できます。これは、セグメントの粒度で行われます。タイムスタンプパラメータはUNIXタイムスタンプであり、タイムスタンプによるオフセットのクエリは、指定されたタイムスタンプよりも前に追加されたメッセージの最新の可能なオフセットを返します。タイムスタンプには、最新と最古の2つの特別な値があります。 UNIXタイムスタンプの他の値の場合、Kafkaは、指定されたタイムスタンプよりも遅く作成されていないログセグメントの開始オフセットを取得します。セグメントの粒度では、オフセットフェッチリクエストは、セグメントサイズが大きいほど精度の低い結果を返します。

より正確な結果を得るには、サイズ(log.segment.bytes)ではなく時間(log.roll.ms)に基づいてログセグメントサイズを構成できます。ただし、ログセグメントが頻繁にローリングするため、ファイルハンドラーの数が増える可能性があるため、注意が必要です。


今後の計画

Kafkaは、メッセージ形式にタイムスタンプを追加します。参照する

https://cwiki.Apache.org/confluence/display/KAFKA/Kafka+Enriched+Message+Metadata

2
zheolong

Kafka Protocol Docは、request/response/Offsets/Messagesで遊ぶのに最適なソースです。 https://cwiki.Apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol Simple Consumerの例を使用します。次のコードは状態を示しています。

FetchRequest req = new FetchRequestBuilder()

        .clientId(clientName)

        .addFetch(a_topic, a_partition, readOffset, 100000) 

        .build();

FetchResponse fetchResponse = simpleConsumer.fetch(req);

readOffsetを設定して、初期オフセットを開始します。ただし、上記と同様に最大オフセットを確認する必要があります。これは、addFetchメソッドの最後のパラメーターのFetchSizeに従って、制限されたオフセット数を提供します。

1
usman

KafkaConsumerを使用すると、Seek、SeekToBeginningおよびSeekToEndを使用してストリーム内を移動できます。

https://kafka.Apache.org/0100/javadoc/org/Apache/kafka/clients/consumer/KafkaConsumer.html#seekToBeginning(Java.util.Collection)

また、パーティションが提供されていない場合、現在割り当てられているすべてのパーティションの最初のオフセットを探します。

0
CamW

これを試してみましたか?

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

この例では、特定のトピック「test」のすべてのメッセージを出力します。

このリンクからの詳細 https://kafka.Apache.org/quickstart

0
Gang Peng