Kafka connect的offset commit机制

1. 说明

版本说明:

  1. Confluent : 2.0.0
  2. Kafka : 0.9.0.0

准确的说,Kafka connector 是一个双向的通道:

  1. kafka->target ,对应任务称为SinkTask;
  2. source->kafka, 对应任务称为SourceTask;

我比较关注的是kafka->hdfs,本文重点是SinkTask的offset commit机制。

2. 迷惑性的配置

在connect的配置文件中有这么一项配置:“offset.storage.topic”。首先声明,在confluent document里面对这个字段的解释就是扯淡的。

offset.storage.topic - the Kafka topic to store connector offset state in. Although this topic can be auto-created if your cluster has auto topic creation enabled, it is highly recommended that you create it before starting the Kafka Connect cluster. To support large Kafka Connect clusters, this topic should have a large number of partitions (e.g. 25 or 50, just like Kafka’s built-in __offsets topic) and highly replicated (3x or more).

看了这段说明,你立马会觉得这就是kafka connect用来存放offset的。BUT,它和SinkTask没多大关系,和hdfsSinkTask没有半毛钱关系。翻阅史书典籍(代码注释),终于得到了详细的说明。
出处:kafka-2.0.0\connect\runtime\src\main\java\org\apache\kafka\connect\storage\OffsetStorageWriter.java

* <p>
 * Connect uses an OffsetStorage implementation to save state about the current progress of
 * source (import to Kafka) jobs, which may have many input partitions and "offsets" may not be as
 * simple as they are for Kafka partitions or files. Offset storage is not required for sink jobs
 * because they can use Kafka's native offset storage (or the sink data store can handle offset
 * storage to achieve exactly once semantics).
 * </p>

大概是这么个意思:

1 . 主要是给SourceTask用的,用来记录Kafka connector对源数据的消费状态,这里的源就不是指kafka了,可能是阿猫阿狗什么的;
2 . SinkTask用不到,因为可以直接用kafka的offset管理机制记录消费状态;

只跑SinkTask时,通过kafka可以看到这个topic里面是没有数据的。

xxx$ ./bin/kafka-run-class kafka.tools.GetOffsetShell --topic connect-offsets --broker-list localhost:9092 --time -1
connect-offsets:0:0

3. kafka connector的offset commit机制

首先将这两个概念剥开:kafka connect和kafka hdfs connect。是confluent下两个项目。kafka connect书写了整个处理框架, hdfs connect专注于目标为hdfs情况下的处理。

3.1 kafka connect 处理过程

SinkTask的处理逻辑集中在WorkerSinkTaskThread.java中。重点关注commitOffsets方法。基本过程是:

  1. 调用task的flush机制记录offset。这个task根据目标文件系统不同,可能有种多样,比如hdfsSinkTask、FileStreamSinkTask等;
  2. 异步向kafka Server commit offset,注意commit是基于partition的;
3.2 kafka hdfs connect 处理过程

准确的说kafka hdfs connect在offset commit这事上什么都没有做。

  @Override
  public void flush(Map<TopicPartition, OffsetAndMetadata> offsets) {
    // Do nothing as the connector manages the offset
  }

也就是说在offset这事上另有高招,什么高招?另起一篇再说咯。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值