我想扩展SinkTask
以创建我自己的接收器连接器。
如果我在刷新期间保存偏移量,下次启动接收器连接器时我想继续读取已保存的偏移量,这样做的正确方法是什么?
我尝试使用被覆盖的SinkTaskContext
的{{1}}分配我自己的偏移量:
initialize(SinkTaskContext context)
但这不起作用,因为尚未分配分区。我得到了例外。
我是否应该将上下文(从@Override
public void initialize(SinkTaskContext context) {
HashMap<TopicPartition, Long> offsetMap = new HashMap<>();
...
context.offset(offsetMap);
}
)保存到全局变量中,然后使用它在方法initialize()
(从open(Collection<TopicPartition> partitions)
中重写)中为其分配偏移量我在SinkTask
内做的一样吗? e.g:
initialize
答案 0 :(得分:0)
在open()
期间重置偏移应是正确的方法,但由于bug尚未解决,目前无法正常处理。
现在的解决方法是处理put()
中的重置偏移。这可能有点违反直觉,但由于您正在管理自己的偏移,因此如果您愿意,您实际上可以忽略数据。当您收到第一个put()
电话时,您可以处理加载偏移并重置它们。所有后续数据将来自您在重置时指定的偏移量。这就是HDFS connector目前实现其一次交付的方式。 (不幸的是,这是一个很好的例子,你可以准确地获得一次但相对复杂的代码。)事实上,由于HDFS连接器驱动了Kafka Connect中的偏移管理功能,因此它不会重置重新平衡正是实施过程中错过的原因。