Kafka-connect sink任务忽略文件偏移存储属性

时间:2017-02-06 16:39:03

标签: java apache-kafka apache-kafka-connect

我在使用Confluent JDBC连接器时遇到了相当奇怪的行为。我很确定它与Confluent堆栈无关,而是与Kafka-connect框架本身无关。

因此,我将offset.storage.file.filename属性定义为默认/tmp/connect.offsets并运行我的接收器连接器。显然,我希望连接器在给定文件中保持偏移量(它在文件系统中不存在,但它应该自动创建,对吧?)。文档说:

  

offset.storage.file.filename   要存储连接器偏移量的文件。通过在磁盘上存储偏移量,可以在单个节点上停止并启动独立进程,并从之前停止的位置继续。

但卡夫卡表现得完全不同。

  1. 检查给定文件是否存在。
  2. 事实并非如此,Kafka只是忽略了它,并在Kafka主题中持续抵消。
  3. 如果我手动创建给定文件,则无论如何都会读取失败(EOFException),并且主题中的偏移将再次保留。
  4. 这是一个错误,或者更可能的是,我不明白如何使用这种配置?我理解两种保持偏移的方法之间的区别,文件存储更方便我的需要。

2 个答案:

答案 0 :(得分:2)

offset.storage.file.filename仅用于连接器。它用于在输入数据源上放置书签,并记住它停止读取的位置。创建的文件包含文件行号(对于文件源)或表行号(对于jdbc源或一般而言的数据库)之类的东西。

在分布式模式下运行Kafka Connect时,该文件将替换为默认命名为connect-offsets的Kafka主题,应将其复制以容忍失败。

sink 连接器而言,无论使用哪种插件或模式(独立/分布式),它们都存储在上一次停止读取其输入主题的内部主题{{ 1}}就像任何Kafka消费者一样。这样就可以使用__consumer_offsets命令行工具之类的传统工具,接收器连接器滞后多少。

Confluent Kafka replicator尽管是源连接器,但可能是一个例外,因为它从远程Kafka读取并且可能使用Kafka使用者。

我同意文档尚不清楚,无论连接器类型是什么(源或接收器),此设置都是必需的,但仅由源连接器使用。该设计决定背后的原因是,单个Kafka Connect工作程序(我的意思是单个JVM进程)可以运行多个连接器,可能同时包括源连接器和接收器连接器。换句话说,此设置是工作人员级别设置,而不是连接器设置。

答案 1 :(得分:0)

属性public class IDbServiceImpl<T> implements IDBService<T>{ @Autowired GenericRepository<T, Serializable> genericRepository; @Override public T create(T object) { return genericRepository.save(object); } 仅适用于以独立模式运行的工作程序。如果您在Kafka主题中看到Kafka持久偏移,则表明您正在以分布式模式运行。您应该使用提供的脚本offset.storage.file.filename启动连接器。有不同模式$unwind的描述。有关在不同模式下运行的说明是here