如何在Kafka Consumer Group中将偏移量重置为任意值?

时间:2019-04-02 14:54:18

标签: apache-kafka

我想将所有分区的偏移量重置为特定值...。我看到kafka-consumer-groups.sh提供了-from-file选项,将偏移量重置为CSV文件中定义的值

任何人都可以共享此csv文件的内容/格式和示例命令吗?

例如: ./kafka_2.12-2.1.1/bin/kafka-consumer-groups.sh --bootstrap-server ${KAFKA_BROKER} --group ${GROUP_NAME} --topic ${TOPIC} --reset-offsets --from-file offsets.csv --execute

offsets.csv的内容/格式是什么?

3 个答案:

答案 0 :(得分:1)

Csv文件格式为(每一行包含有关一个分区的信息):

topicName,partitionNumber,offset
topicName,partitionNumber,offset

示例csv内容(reset-policy.csv)。

someTopic1,0,1
someTopic2,1,5

基于csv文件重置偏移量的命令是:

./bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --group gr1 --from-file reset-policy.csv --reset-offsets --execute

答案 1 :(得分:1)

@wardziniak的答案是所要求的关键信息,但是我可以添加以下有用的花絮:

您可以使用--export的{​​{1}}命令从现有信息创建CSV文件,而无需通过kafka-consumer-groups进行任何更改。例如:

--dry-run

bin/kafka-consumer-groups \ --bootstrap-server $KAFKA \ --export --group $GROUP_NAME --topic $TOPIC \ --reset-offsets --to-current \ --dry-run 可以更改为其他各种值,例如--to-current--to-datetime等。

该命令的输出是--by-period必需的必需CSV文件。

一个非常有用的用例是将偏移量从一个消费者组复制到另一个消费者组,例如:

--from-file

答案 2 :(得分:0)

如果您计划在 Java 应用程序中更改偏移量,您可以使用 AdminClient's API alterConsumerGroupOffsets

这是一个用 Kafka 2.8.0 测试的简单示例:

String brokers = "localhost:9092";
String consumerGroupName = "test1337";
TopicPartition topicPartition = new TopicPartition("test", 0);
Long offset = 4L;

Map<TopicPartition, OffsetAndMetadata> toOffset = new HashMap<>();
toOffset.put(topicPartition, new OffsetAndMetadata(offset));

// Create AdminClient
final Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
AdminClient adminClient = AdminClient.create(properties);

try {
  // Check offsets before altering
  KafkaFuture<Map<TopicPartition, OffsetAndMetadata>> offsetsBeforeResetFuture = adminClient.listConsumerGroupOffsets(consumerGroupName).partitionsToOffsetAndMetadata();
  System.out.println("Before: " + offsetsBeforeResetFuture.get().toString());

  // Alter offsets
  adminClient.alterConsumerGroupOffsets(consumerGroupName, toOffset).partitionResult(topicPartition).get();

  // Check offsets after altering
  KafkaFuture<Map<TopicPartition, OffsetAndMetadata>> offsetsAfterResetFuture = adminClient.listConsumerGroupOffsets(consumerGroupName).partitionsToOffsetAndMetadata();
  System.out.println("After:  " + offsetsAfterResetFuture.get().toString());
} catch (InterruptedException e) {
  e.printStackTrace();
} catch (ExecutionException e) {
  e.printStackTrace();
} finally {
  adminClient.close();
}

这会打印出来

Before: {test-0=OffsetAndMetadata{offset=1, leaderEpoch=null, metadata=''}}
After:  {test-0=OffsetAndMetadata{offset=4, leaderEpoch=null, metadata=''}}

您可以扩展该示例以加载一个 csv 文件,该文件包含有关消费者组、主题、分区和该分区的新偏移量的所有信息。