如何为消费者设置卡夫卡偏移量?

时间:2018-10-31 09:26:00

标签: apache-kafka apache-flink

假设我的主题中已经有10个数据,现在我开始用Flink编写使用者,该使用者将使用第11个数据。

因此,我有3个问题:

  1. 如何分别获取当前主题的分区数和每个分区的偏移量?
  2. 如何为消费者手动设置每个分区的起始位置?
  3. 如果Flink使用者崩溃,并且几分钟后恢复。消费者将如何知道从哪里重新启动?

感谢您的帮助。示例代码(我尝试过FlinkKafkaConsumer08FlinkKafkaConsumer10,但都例外。):

public class kafkaConsumer {
public static void main(String[] args) throws Exception {
    // create execution environment
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    env.enableCheckpointing(5000);

    Properties properties = new Properties();
    properties.setProperty("bootstrap.servers", "192.168.95.2:9092");
    properties.setProperty("group.id", "test");
    properties.setProperty("auto.offset.reset", "earliest");

    FlinkKafkaConsumer09<String> myConsumer = new FlinkKafkaConsumer09<>(
            "game_event", new SimpleStringSchema(), properties);


    DataStream<String> stream = env.addSource(myConsumer);

    stream.map(new MapFunction<String, String>() {
        private static final long serialVersionUID = -6867736771747690202L;

        @Override
        public String map(String value) throws Exception {
            return "Stream Value: " + value;
        }
    }).print();

    env.execute();
    }
}

还有pom.xml:

    <dependency>
        <groupId>org.apache.flink</groupId>
        <artifactId>flink-clients_2.11</artifactId>
        <version>1.6.1</version>
    </dependency>

1 个答案:

答案 0 :(得分:1)

  1. 为了从特定偏移量开始使用分区中的消息,可以参考Flink Documentation l:
  

您还可以指定使用者应从的确切偏移量   对于每个分区:

Map<KafkaTopicPartition, Long> specificStartOffsets = new HashMap<>();
specificStartOffsets.put(new KafkaTopicPartition("myTopic", 0), 23L);
specificStartOffsets.put(new KafkaTopicPartition("myTopic", 1), 31L);
specificStartOffsets.put(new KafkaTopicPartition("myTopic", 2), 43L);

myConsumer.setStartFromSpecificOffsets(specificStartOffsets);
     

上面的示例将使用者配置为从指定的开始   主题myTopic的分区0、1和2的偏移量。偏移值   应该是消费者应阅读的下一个记录   划分。请注意,如果使用者需要读取一个分区,   在提供的偏移量图内没有指定的偏移量,   将回退到默认的组补偿行为(即   该特定分区的setStartFromGroupOffsets())。

     

请注意,这些开始位置配置方法不会影响   自动从故障中恢复作业的开始位置   或使用保存点手动还原。恢复时,开始位置   每个Kafka分区的大小取决于存储在   保存点或检查点(请参阅下一部分以获取信息)   有关为消费者启用容错功能的检查点。

  1. 万一其中一个使用者崩溃了,一旦恢复,Kafka将参考consumer_offsets主题,以便从崩溃之前的位置继续处理消息。 consumer_offsets是一个主题,用于存储有关每个三元组(主题,分区,组)的已提交偏移量的元数据信息。它还会定期压缩,以便仅提供最新的偏移量。您还可以参考Flink's Kafka Connectors Metrics
  

Flink的Kafka连接器通过Flink的指标提供了一些指标   系统分析连接器的行为。生产者出口   Kafka的内部指标通过Flink的指标体系   支持的版本。消费者导出所有指标,从   Kafka 0.9版。 Kafka文档列出了所有导出的指标   在其文档中。

     

除这些指标外,所有消费者还暴露当前冲销   和每个主题分区的承诺偏移量。电流偏移   指分区中的当前偏移量。这是指   我们成功检索并成功发出的最后一个元素的偏移量。   提交的偏移量是最后的提交的偏移量。

     

Flink中的Kafka消费者将偏移量返还给Zookeeper   (Kafka 0.8)或Kafka经纪人(Kafka 0.9+)。如果检查点是   禁用时,将定期提交偏移量。通过检查点,   一旦流拓扑中的所有运算符具有   确认他们已经创建了状态检查站。这个   为用户提供至少一次提交的偏移量的语义   给Zookeeper或经纪人。对于指向Flink的偏移量,   系统只提供一次保证。

     

提交给ZK或经纪人的偏移量也可以用于跟踪   Kafka消费者的阅读进度。两者之间的区别   提交的偏移量,每个分区中的最新偏移量是   称为消费者滞后。如果Flink拓扑正在使用数据   主题比添加新数据慢,则滞后会增加   消费者将落后。对于大型生产部署,我们   建议监控该指标以避免增加延迟。