web-dev-qa-db-ja.com

Kafka Consumer Groupを削除してオフセットをリセットするにはどうすればよいですか?

Kakfaコンシューマーグループを削除して、アプリケーションがコンシューマーを作成し、トピックをサブスクライブするときに、トピックデータの先頭から開始できるようにします。

これは、Kafka 0.10.1.1を使用する最新のConfluent Platform 3.1.2を使用した単一ノード開発vmを使用したものです。

私は通常の構文を試します:

Sudo /usr/bin/kafka-consumer-groups --new-consumer --bootstrap-server localhost:9092 --delete --group my_consumer_group

エラーが表示されます:

Option [delete] is only valid with [zookeeper]. Note that there's no need to delete group metadata for the new consumer as the group is deleted when the last committed offset for that group expires.

Zookeeperバリアントを試してみると:

Sudo /usr/bin/kafka-consumer-groups --zookeeper localhost:2181 --delete --group my_consumer_group

私は得る:

Delete for group my_consumer_group failed because group does not exist.

「古い」消費者を使用してリストした場合、消費者グループ(または他の消費者グループ)は表示されません

Sudo /usr/bin/kafka-consumer-groups --zookeeper localhost:2181 --list

「新しい」コンシューマーを使用してリストすると、コンシューマーグループは表示されますが、削除できないようです。

Sudo /usr/bin/kafka-consumer-groups --new-consumer --bootstrap-server localhost:9092 --list
9
clay

Kafka 0.10.2でリリースされたConfluent Platform 3.2にアップグレードすると、根本的な問題が解決しました。トピックを削除すると、オフセット情報が正しくリセットされるようになりました。 、消費者は新しいデータの先頭から開始します。

kafka-consumer-groupsツールを使用して新しいスタイルのコンシューマーグループを削除することはできませんが、根本的な問題は解決しました。

Kafka 0.10.2の前に、ハッキングがありましたが、この問題に対する明確な解決策はありませんでした。

3
clay

Kafka 0.11(またはConfluent 3.3)では、トピックを削除せずに既存のコンシューマーグループのオフセットをリセットできます。実際には、オフセットを任意の絶対オフセット値またはタイムスタンプまたは任意に変更できます。相対位置も同様です。

これらの新しい関数はすべて、--reset-offsetsコマンドラインツールの新しいkafka-consumer-groupsフラグで追加されます。

こちらのKIP-122の詳細を参照してください https://cwiki.Apache.org/confluence/display/KAFKA/KIP-122%3A+Add+Reset+Consumer+Group+Offsets+tooling

7
Hans Jespersen

これはKafka 1.1.xで行えます。ドキュメントから:

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --delete --group my-group --group my-other-group

4
Bitswazsky

Java clientを使用すると、最初に開始オフセットを取得できます。

TopicPartition partition = new TopicPartition("YOUR_TOPIC", YOUR_PARTITION);
Map<TopicPartition, Long> map = consumer.beginningOffsets(Collections.singleton(partition));

そして、消費者が処理を開始するために使用するオフセット(消費者グループを削除しない場合)。

Long committedOffset = consumer.committed(partition).offset();

ここで、committedOffsetから開始しても問題ないと思われる場合は、レコードをポーリングしてください。開始オフセットが必要な場合は、consumer.seek(partition、map.get(partition));

3
zeromem