查看最新的(v0.10)Kafka消费者documentation:
“消费者的位置给出了将要发出的下一条记录的偏移量。它将比消费者在该分区中看到的最高偏移量大一个。它会自动前进消费者接收数据电话民意调查(长)并接收消息的时间。“
有没有办法查询服务器端分区可用的最大偏移量,没有检索所有消息?
我试图实现的逻辑如下:
我的动机是我需要进行一些批处理,但我希望处理器只在有足够的数据时醒来(而且我不想两次检索所有数据)。
答案 0 :(得分:7)
您可以使用Consumer.seekToEnd()
方法,运行Consumer.poll(0)
使其生效但立即返回,然后Consumer.position()
查找所有已订阅(或已分配)主题分区的位置。这些将是所有分区的当前最终偏移量。这也将开始从代理中获取这些偏移量的一些数据,但如果您随后寻求回到不同的位置,任何返回的数据都将被忽略。
目前serejja提到的另一种选择是使用旧的简单消费者,尽管这个过程要复杂得多,因为你需要手动找到每个分区的领导者。
答案 1 :(得分:1)
可悲的是,我不知道0.10消费者如何做到这一点。
但是,如果您有任何较低级别的Kafka客户端,这是可行的(对不起,但我不确定JVM是否存在,但是其他语言有很多)。
因此,如果你有时间和灵感来实现这一点,那么就行了 - 每个FetchResponse
(这是每个&#34的响应;给我消息"请求)包含一个名为HighwaterMarkOffset
的字段,它基本上是分区末尾的偏移量(https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol#AGuideToTheKafkaProtocol-FetchResponse)。这里的诀窍是发送一个FetchRequest
,它会立即返回(例如,等待阻止等待)除了HighwaterMarkOffset之外什么都没有。
为此,您的FetchRequest
应该:
MaxWaitTime
设置为0
,这意味着"如果无法获取至少MinBytes字节,则立即返回"。MinBytes
设置为0
,这意味着"如果你给我一个空的回复,我就可以了。#/ li>。FetchOffset
在这种情况下并不重要,如果我没有错,它甚至可能是无效的偏移,但最好是有效的偏移。MaxBytes
设置为0
,这意味着"给我不超过0个字节的数据",例如什么都没有。这样,此请求将立即返回,没有数据,但仍将highwatermark偏移设置为适当的值。获得高水位线偏移后,您可以将其与当前偏移量进行比较,并计算出您的背后有多少。
希望这有帮助。
答案 2 :(得分:0)
您可以使用以下API中的此方法public OffsetAndMetadata committed(TopicPartition partition)
来获取上次提交的偏移量