Flink的Checkpoint与Kafka的偏移量

1、Kafka的offset

  1. Kafka0.8版本以前,offset默认存储在zookeeper中(基于Zookeeper)
  2. Kafka0.9版本以后,offset默认存储在内部的topic中,基于 __consumer_offsets 的Topic中。

2、kafka消费offset提交配置


1. checkpoint禁用:

flink kafka消费依赖于内部kafka客户端自动定期的offset提交

配置:enable.auto.commit / auto.commit.interval.ms


2. checkpoint启用:

flink kafka consumer在checkpoint完成时自动提交offset在checkpoint state中;

配置:setCommitOffsetsOnCheckpoints(boolean) 来启用关闭;默认情况下,是开启的true
此模式下,配置在properties中自动周期性的offset提交将被忽略;

3、程序出现了异常,恢复subTask,读取偏移量,从StateBackend恢复还是kafka中恢复?

1、StateBackend 偏移量目录,你会发现kafka中特殊的topic也有偏移量,但是它不是用来恢复的,是用来做监控的。
2、如果你不想让kafka中特殊的topic有偏移量,也可以取消。官网中这样记载。

在这里插入图片描述

3、只需要添加一下:

// kafka中的偏移量取消掉【不建议false,默认是true,它用来监控这个偏移量】
kafkaSource.setCommitOffsetsOnCheckpoints(false);

4、从kafka生产者中继续写数据的话,并没有从头读取,也不会从kafka中特殊的topic继续读取。

5、如果停掉程序呢?

        5.1、如果开启了checkpointing,一定会保存到statebackend中去

        5.2、没有指定savepoint的话,首先查看kafka特殊的topic,然后查看恢复文件。

Flink 中,可以通过 `KafkaConsumer` 提供的 `FlinkKafkaConsumer` 来消费 Kafka 中的数据。而保存消费 Kafka偏移量可以使用 Flink 提供的 `FlinkKafkaConsumer` 的 `enableCheckpointing` 方法来实现。 具体做法如下: 1. 在创建 `FlinkKafkaConsumer` 对象时,设置 `enableCheckpointing` 方法开启 Flinkcheckpoint 机制。 ```java FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), properties); kafkaConsumer.setStartFromEarliest(); kafkaConsumer.setCommitOffsetsOnCheckpoints(true); env.enableCheckpointing(5000); ``` 2. 设置 `setCommitOffsetsOnCheckpoints` 方法为 `true`,表示 Flink 在进行 checkpoint 时会自动提交当前消费 Kafka偏移量。 3. 在 Flink 应用程序中,可以通过实现 `CheckpointedFunction` 接口来手动管理 Kafka 偏移量的保存和恢复。 ```java public class KafkaConsumer implements SourceFunction<String>, CheckpointedFunction { private transient ListState<Long> offsetState; private volatile boolean isRunning = true; private long offset = 0L; @Override public void snapshotState(FunctionSnapshotContext context) throws Exception { offsetState.clear(); offsetState.add(offset); } @Override public void initializeState(FunctionInitializationContext context) throws Exception { ListStateDescriptor<Long> offsetStateDescriptor = new ListStateDescriptor<>("offsets", Long.class); offsetState = context.getOperatorStateStore().getListState(offsetStateDescriptor); if (context.isRestored()) { for (Long offset : offsetState.get()) { this.offset = offset; } } } @Override public void run(SourceContext<String> ctx) throws Exception { while (isRunning) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000)); for (ConsumerRecord<String, String> record : records) { offset = record.offset(); ctx.collect(record.value()); } } } } ``` 在 `snapshotState` 方法中,将当前消费 Kafka偏移量保存到 `offsetState` 状态变量中。在 `initializeState` 方法中,可以从状态变量中恢复保存的偏移量。在 `run` 方法中,每次消费 Kafka 中的数据时,都会更新 `offset` 变量为当前消费的偏移量。 这样,当 Flink 应用程序出现故障,重新启动时,就可以从保存的偏移量处继续消费 Kafka 中的数据,避免了数据的重复消费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值