flink checkpoint 重启_当Flink遇到Kafka - FlinkKafkaConsumer使用详解

本文详细介绍了如何配置Flink读取Kafka,包括FlinkKafkaConsumer的配置、起始offset设置、容错机制和offset提交行为。Flink通过轻量级checkpoint和Kafka的低级API实现高吞吐量下的exactly-once语义,并提供了监控方案。

Flink是新一代的流处理计算引擎。通过轻量级的checkpoint,Flink可以在高吞吐量的情况下保证exactly-once(这需要数据源能够提供回溯消费的能力)。Flink支持众多的source(从中读取数据)和sink(向其写入数据),列表如下:

369660173c556cd0f33d0f05d0538618.png
7733145db2e80990943717e2ef7f58ba.png

Kafka作为目前非常流行的消息中间件,它不仅能够提供极大的吞吐量,还能够配合Flink在消费端达到exactly-once。

本文将详细介绍如何配置Flink读取Kafka,运行机制和exactly-once是如何保证的,最后,还会给出监控Flink消费Kafka的方案。(注: 本文的使用的是Flink 1.3.1-release和 Kafka 0.8)

Flink 是通过Connector与具体的source 和 sink进行通信的,具体到Kafka 0.8,相应的Connector是 FlinkKafkaConsumer08和FlinkKafkaProducer08。

我们首先介绍FlinkKafkaConsumer08的配置:

一、 Kafka Consumer的配置

FlinkKafkaConsumer08可以消费一个或多个Kafka topic的数据,它的构造器需要接收以下参数:

1. topic名或 topic名的列表

2. 反序列化约束,以便于Flink决定如何反序列化从Kafka获得的数据

3. Kafka consumer的属性配置,下面两个属性配置是必须的:

· “zookeeper.connect” (Zookeeper servers的地址列表,以逗号分隔)

· “group.id” (consumer group)

· “bootstrap.servers” (Kafka brokers的地址列表,以逗号分隔)

示例代码:

6610ee9babad0206ca9cc3855e2245c9.png

以下几个参数是需要我们重点关注的。

(一) 反序列化shema

Flink Kafka Consumer 需要知道如何将来自Kafka的二进制数据转换为Java/Scala对象。DeserializationSchema接口允许程序员指定这个序列化的实现。该接口的 T deserialize(byte[]message) 会在收到每一条Kafka的消息的时候被调用。

我们通常会实现 AbstractDeserializationSchema,它可以描述被序列化的Java/Scala类型到Flink的类型(TypeInformation)的映射。如果用户的代码实现了DeserializationSchema,那么就需要自己实现getProducedType(...) 方法。

为了方便使用,Flink提供了一些已实现的schema:

1. TypeInformationSerializationSchema (andTypeInformationKeyValueSerializationSchema) ,他们会基于Flink的TypeInformation来创建schema。这对于那些从Flink写入,又从Flink读出的数据是很有用的。这种Flink-specific的反序列化会比其他通用的序列化方式带来更高的性能。

2. JsonDeserializationSchema (andJSONKeyValueDeserializationSchema) 可以把序列化后的Json反序列化成ObjectNode,ObjectNode可以通过objectNode.get(“field”).as(Int/String/…)() 来访问指定的字段。

3. SimpleStringSchema可以将消息反序列化为字符串。当我们接收到消息并且反序列化失败的时候,会出现以下两种情况: 1) Flink从deserialize(..)方法中抛出异常,这会导致job的失败,然后job会重启;2) 在deserialize(..) 方法出现失败的时候返回null,这会让Flink Kafka consumer默默的忽略这条消息。请注意,如果配置了checkpoint 为enable,由于consumer的失败容忍机制,失败的消息会被继续消费,因此还会继续失败,这就会导致job被不断自动重启。

(二) Kafka Consumers 起始offset配置

FlinkKafkaConsumer 允许我们配置Kafka partition被消费的offset的起始位,示例代码如下:

### 3.1 端到端一致性的核心机制 在 Kafka-Flink-ClickHouse 架构中实现端到端的数据一致性,核心在于确保数据从 Kafka 源端到 Flink 处理层,再到 ClickHouse 目标端的完整性和一致性。Flink 通过 **CheckPoint** 机制保障 Exactly-Once 的语义,确保在发生故障时能够恢复到某个一致性的状态快照,从而避免数据丢失或重复处理[^4]。 FlinkCheckPoint 是一种全局一致性快照,记录所有任务在某个时间点的状态,这个时间点应恰好是所有任务都处理完相同输入数据的状态。通过这种方式,Flink 可以在任务失败时恢复到最近的一致性状态,保证状态的准确性和一致性[^3]。 ### 3.2 KafkaFlink 的一致性保障 Kafka 作为数据源,其一致性保障依赖于消费者组的 offset 提交机制。Flink Kafka Consumer 支持从 Kafka 读取数据并维护 offset 的 CheckPoint 状态,确保在发生故障时可以从最近的 CheckPoint 恢复,并重新读取 Kafka 中未被确认的数据,从而实现 Exactly-Once 的语义[^1]。 Flink Kafka Consumer 在 CheckPoint 完成后,会提交 Kafka 的 offset,确保消费进度与 CheckPoint 状态同步。这种方式避免了 offset 提交与状态更新之间的不一致问题,保障了 KafkaFlink 的数据一致性。 ### 3.3 Flink 到 ClickHouse 的一致性保障 ClickHouse 作为目标端,需要确保 Flink 写入的数据在发生故障时不会丢失或重复。Flink 提供了 Sink 端的事务性写入机制,通过支持两阶段提交(TwoPhaseCommitSinkFunction)实现 Exactly-Once 语义。 Flink 的事务性 Sink 会在 CheckPoint 触发时开启事务,将数据写入 ClickHouse 但不立即提交。只有当 CheckPoint 成功完成时,Flink 才会提交事务,确保写入的数据与 CheckPoint 状态保持一致。如果 CheckPoint 失败,事务将被回滚,防止部分写入导致的数据不一致[^5]。 以下是一个基于 `TwoPhaseCommitSinkFunction` 的 ClickHouse Sink 示例: ```java public class ClickHouseExactlyOnceSink extends TwoPhaseCommitSinkFunction<String, TransactionHolder, Void> { public ClickHouseExactlyOnceSink() { super(new ClickHouseTransactionManager(), new ClickHouseStateSerializer()); } @Override public void invoke(TransactionHolder transaction, String value) throws Exception { // 将数据写入 ClickHouse,但不提交 ClickHouseClient.write(value, transaction.getTransactionId()); } @Override public void commit(TransactionHolder transaction) throws Exception { // 提交事务,确保数据持久化 ClickHouseClient.commit(transaction.getTransactionId()); } @Override public void abort(TransactionHolder transaction) throws Exception { // 回滚事务,防止数据不一致 ClickHouseClient.rollback(transaction.getTransactionId()); } } ``` ### 3.4 端到端一致性保障的关键点 为实现 Kafka-Flink-ClickHouse 架构中的端到端一致性,需确保以下关键点: - **Kafka 消费一致性**:Flink Kafka Consumer 必须启用 CheckPoint,并将 offset 提交与 CheckPoint 同步,确保数据不丢失也不重复。 - **Flink 状态一致性**:Flink 作业必须启用 CheckPoint,并配置合理的 CheckPoint 间隔,确保状态一致性快照的及时性。 - **Sink 端事务性写入**:Flink 写入 ClickHouse 时必须使用事务性 Sink,确保数据在 CheckPoint 成功后才提交,避免数据不一致。 - **故障恢复机制**:Flink 必须配置合适的重启策略和 CheckPoint 存储方式(如使用 HDFS 或 S3),确保在任务失败时能够正确恢复状态。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值