java-如何在kafka中显示每个分区而不是每个记录?

时间:2018-10-18 04:00:45

标签: java apache-kafka partition consumer

我目前正在用Java构建一个kafka使用者,它将仅显示分区(我有10个分区)以及特定topicgroup id的偏移量。我当前的代码显示给定输入的每条记录(或每行数据)。如果我有10个分区和15行数据,它将显示15行和该分区的多个实例。

以下是我为消费者设置的信息:

private static Consumer<Long, String> createConsumer() {
    System.out.println("CREATE CONSUMER");
    //Configure consumer settings/properties
    final Properties props = new Properties();
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
    props.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_PLAINTEXT");
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
    props.put(ConsumerConfig.GROUP_ID_CONFIG, GROUPID);
    props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest");
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");

    // Create the consumer using props.
    final Consumer<Long, String> consumer =  new KafkaConsumer<>(props);

    // Subscribe to the topic.
    consumer.subscribe(Collections.singletonList(TOPIC));
    return consumer;
}

这是我用于显示输出的代码:

while (noRecordsCount < giveUp)
    {
        final ConsumerRecords<Long, String> consumerRecords = consumer.poll(500);

        if (consumerRecords.count() == 0)
        {
            noRecordsCount++;
            if (noRecordsCount > giveUp) break;
            else continue;
        }          

        //Stores each topic and partition to a specific array list for easier output manipulation
        consumerRecords.forEach(record -> {
            partitionrecord.add(record.partition());
            offsetrecord.add(record.offset());
            System.out.printf("Consumer Record: %s (%d, %d)"+"\n", TOPIC, record.partition(), record.offset()); 

        });

    }

代码输出:

预期输出显示每个分区而不是每个记录(主题名称,分区号,偏移量)的实例:

我需要做的是显示10个分区,而不是显示每个(15)记录及其特定信息(偏移量,分区,值等)。我需要在代码中添加任何特定的命令或功能吗?我是堆栈溢出的新手,如果我的询问时间过长,我深表歉意。

1 个答案:

答案 0 :(得分:0)

对于分配给使用者实例的所有分区,您将始终获取所有最新记录,这些记录都遵循最新的偏移量。

如果您运行十个使用者,则应该期望每个实例仅看到一个分区,但仍然可以看到所有偏移量。

没有设置只能获得一条记录,因为这取决于生产者在消费者开始等待它们之后才平均发送N条消息。

对于分配了一个以上分区的使用者实例,也无法保证跨分区进行排序


但是,您可以使用TreeMap或max-heap数据结构来存储数据点,然后按顺序循环遍历分区,并输出每个分区的最大消耗的偏移量

换句话说,您当前正在打印每条记录,而不是在所有循环遍历分区之后再打印,因此将获得第一个显示的输出

因此,无法在“ Kafka”中完成所需的操作,但是您要问的问题实际上是如何在获取记录时批处理记录,然后仅存储最大记录,然后最终在哪里输出这些信息。

注意:GetOffsetShell命令已经可以查询所有分区的最大当前偏移量