Kafkaのポーリング中に、subscribe()
関数を使用して複数のトピックをサブスクライブしました。ここで、トピックからのseek()
およびpoll()
のたびに再サブスクライブすることなく、各トピックから読み取るオフセットを設定します。トピック名のそれぞれに対してseek()
を繰り返し呼び出し、データをポーリングする前に結果を達成しますか?オフセットはどのようにカフカに正確に保存されますか?
トピックごとに1つのパーティションがあり、すべてのトピックから読み取るコンシューマが1つだけです。
Kafka=各トピックのオフセットをどのように保存しますか?
Kafkaは、オフセットストレージをzookeeperからkafkaブローカーに移動しました。理由は以下のとおりです。
zookeeperはオフセット書き込みなどの高書き込み負荷を処理するのに適した方法ではありません。zookeeperは各書き込みをすべてのノードにルーティングするため、書き込みをパーティション化またはスケーリングする機能がないためです。私たちは常にこれを知っていましたが、zkにすでに依存していたため、この実装を一種の「便利な結婚」として選択しました。
Kafkaは、オフセットコミットをトピックに格納します。コンシューマがオフセットをコミットすると、kafka=コミットオフセットメッセージを「commit-log」トピックに発行し、グループ/トピックをマップしたメモリ内構造を保持します/高速な検索のための最新のオフセットへのパーティション詳細な設計情報は、このページにあります オフセット管理に関するページ 。
次に、トピックからのseek()およびpoll()のたびにサブスクライブすることなく、各トピックから読み取るオフセットを設定します。
kafka=オフセットをリセットする管理ツールに関する新機能があります。
kafka-consumer-group.sh --bootstrap-server 127.0.0.1:9092 --group
your-consumer-group **--reset-offsets** --to-offset 1 --all-topics --execute
使用できるその他のオプション があります。
実際には オフセットを保存するZookeeper です。
次に、コンシューマーでおよび特定のgroup_idで、次のように特定のトピックから読み取ることを選択できます。
そのためには、プロパティを使用できます。
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
「最も早い」他のオプションの代わりに:
これはKafkaコンシューマーのサンプルです:
public class ConsumerGroup {
public static void main(String[] args) throws Exception {
if(args.length < 2){
System.out.println("Usage: consumer <topic> <groupname>");
return;
}
String topic = args[0];
String group = args[1];
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", group);
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put("key.deserializer",
"org.Apache.kafka.common.serializa-tion.StringDeserializer");
props.put("value.deserializer",
"org.Apache.kafka.common.serializa-tion.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
System.out.println("Subscribed to topic " + topic);
int i = 0;
while (true) {
ConsumerRecords<String, String> records = con-sumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
Kafkaのオフセットは、コンシューマー側に格納されます。各コンシューマーは、通常はzookeeperに各トピックのオフセットを格納します。