flink消费kafka管理offset

本文主要讲:(自己管理offset)通过自定义kafkaconsumer的反序列方式是可以拿到kafka message的所有信息的,包括topic partition offset等。
另外:

我们需要编写一个Kafka Consumer,通过Flink计算引擎从Kafka相应的Topic中读取数据。在Flink中,我们可以通过FlinkKafkaConsumer08来实现,这个类提供了读取一个或者多个Kafka Topic的机制。它的构造函数接收以下几个参数:
  1、topic的名字,可以是String(用于读取一个Topic)List(用于读取多个Topic);
  2、可以提供一个DeserializationSchema KeyedDeserializationSchema用于反系列化Kafka中的字节数组;
  3、Kafka consumer的一些配置信息,而且我们必须指定bootstrap.serverszookeeper.connect(这个属性仅仅在Kafka 0.8中需要)和group.id属性。

好了,我们来使用FlinkKafkaConsumer08类吧,初始化如下:

val properties = new Properties();
properties.setProperty("bootstrap.servers", "www.iteblog.com:9092");
// only required for Kafka 0.8
properties.setProperty("zookeeper.connect", "www.iteblog.com:2181");
properties.setProperty("group.id", "iteblog");
val stream = env.addSource(new FlinkKafkaConsumer08[String]("iteblog", 
        new SimpleStringSchema(), properties))
stream.print()

上面的例子中使用到SimpleStringSchema来反系列化message,这个类是实现了DeserializationSchema接口,并重写了T deserialize(byte[] message)函数,DeserializationSchema接口仅提供了反系列化data的接口,所以如果我们需要反系列化key,我们需要使用KeyedDeserializationSchema的子类。KeyedDeserializationSchema接口提供了T deserialize(byte[] messageKey, byte[] message, String topic, int partition, long offset)方法,可以饭系列化kafka消息的data和key。

  为了方便使用,Flink内部提供了一序列的schemas:TypeInformationSerializationSchemaTypeInformationKeyValueSerializationSchema,它可以根据Flink的TypeInformation信息来推断出需要选择的schemas。

如果我们启用了Flink的Checkpint机制,那么Flink Kafka Consumer将会从指定的Topic中消费消息,然后定期地将Kafka offsets信息、状态信息以及其他的操作信息进行Checkpint。所以,如果Flink作业出故障了,Flink将会从最新的Checkpint中恢复,并且从上一次偏移量开始读取Kafka中消费消息。

我们需要在执行环境下启用Flink Checkpint机制,如下:

val env = StreamExecutionEnvironment.getExecutionEnvironment()

env.enableCheckpointing(5000) // checkpoint every 5000 msecs

需要主要的是,Flink仅仅支持在拥有足够的处理slots情况下才能够从Checkpint恢复。Flink on YARN模式下支持动态地重启丢失的YARN containers。

如果我们没有启用Checkpint,那么Flink Kafka consumer将会定期地向Zookeeper commit偏移量。

 

Kafka Consumer Offset 自动提交设置

1 开启Check Point时(checkpoint管理)

Checkpoint后,同步offset给kafka。

2 未开启Check Point时(kafka管理)

enable.auto.commit: true

auto.commit.interval.ms: 1500

 

(自己管理offset)

通过自定义kafkaconsumer的反序列方式是可以拿到kafka message的所有信息的,包括topic partition offset等。

自行设置偏移量保存位置

这里采用了zookeeper作为保存的地址,就是实时更新偏移量属性。再job挂掉后重新拉取偏移量保存下来
就能一次消费啦,但真正做到一次消费必须和业务场景结合来做,比如事务。

废话不多说啦,我本地实现了一个例子

        <dependency>
            <groupId>com.wehotel</groupId>
            <artifactId
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值