flink中消费kafka数据防止乱序

 

 

Kafka 分区时间戳

当以 Kafka 来作为数据源的时候,通常每个 Kafka 分区的数据时间戳是递增的(事件是有序的),但是当你作业设置多个并行度的时候,Flink 去消费 Kafka 数据流是并行的,那么并行的去消费 Kafka 分区的数据就会导致打乱原每个分区的数据时间戳的顺序。在这种情况下,你可以使用 Flink 中的 Kafka-partition-aware 特性来生成水印,使用该特性后,水印会在 Kafka 消费端生成,然后每个 Kafka 分区和每个分区上的水印最后的合并方式和水印在数据流 shuffle 过程中的合并方式一致。

如果事件时间戳严格按照每个 Kafka 分区升序,则可以使用前面提到的 AscendingTimestampExtractor 水印生成器来为每个分区生成水印。下面代码教大家如何使用 per-Kafka-partition 来生成水印。

FlinkKafkaConsumer011<Event> kafkaSource = new FlinkKafkaConsumer011<>("aaa", schema, props);
kafkaSource.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Event>() {

    @Override
    public long extractAscendingTimestamp(Event event) {
        return event.eventTimestamp();
    }
});

DataStream<Event> stream = env.addSource(kafkaSource);

下图表示水印在 Kafka 分区后如何通过流数据流传播:

 

标题

 

如果Flink消费Kafka数据,可能有以下几个原因: 1. 检查Kafka集群的连接配置是否正确。确保在PROPS配置文件正确设置了bootstrap.servers参数,指定了正确的Kafka集群的host和port。 2. 检查消费者所属的消费者组ID是否正确。在PROPS配置文件,确保group.id参数设置为正确的消费者组ID。 3. 检查消费者的键和值的序列化方式是否正确。在PROPS配置文件,确保key.deserializer和value.deserializer参数设置为正确的序列化方式。 4. 检查消费者的偏移量设置是否正确。在PROPS配置文件,确保auto.offset.reset参数设置为正确的偏移量方式,比如earliest表示从最早的偏移量开始消费。 5. 检查Flink代码的配置是否正确。确保在Flink代码正确设置了Kafka消费者和反序列化器。 如果以上步骤都检查过了,仍然无法消费Kafka数据,可以尝试查看Flink的日志文件,查找可能的错误信息。另外,还可以检查Kafka集群的状态,确保Kafka集群正常运行并且有可用的数据。 #### 引用[.reference_title] - *1* *2* *3* [flink实时消费kafka topic数据处理](https://blog.csdn.net/weixin_43930865/article/details/126626876)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值