Kafka日志中的偏移量丢失 - 简单消费者无法继续

时间:2013-09-30 13:07:05

标签: java apache-kafka apache-storm

我有一个3节点kafka群集设置。我正在使用风暴来阅读来自kafka的消息。我系统中的每个主题都有7个分区。

现在我面临一个奇怪的问题。直到3天前,一切都运转良好。但是,现在看来我的风暴拓扑结构无法从2个分区中专门读取 - #1和#4。

我试图深入研究问题并发现在我的kafka日志中,对于这两个分区,一个偏移量丢失,即在5964511之后,下一个偏移量为5964513而不是5964512。

由于缺少偏移,Simple Consumer无法继续下一个偏移。我做错了什么或者它是一个已知的错误?

这种行为可能是什么原因?

我使用以下代码来读取有效偏移的窗口:

public static long getLastOffset(SimpleConsumer consumer, String topic, int partition,
                                 long whichTime, String clientName) {
    TopicAndPartition topicAndPartition = new TopicAndPartition(topic, partition);
    Map<TopicAndPartition, PartitionOffsetRequestInfo> requestInfoMap = new HashMap<TopicAndPartition, PartitionOffsetRequestInfo>();
    requestInfoMap.put(topicAndPartition, new PartitionOffsetRequestInfo(kafka.api.OffsetRequest.LatestTime(), 100));
    OffsetRequest request = new OffsetRequest( requestInfoMap, kafka.api.OffsetRequest.CurrentVersion() , clientName);
    OffsetResponse response = consumer.getOffsetsBefore(request);
    long[] validOffsets = response.offsets(topic, partition);
    for (long validOffset : validOffsets) {
        System.out.println(validOffset + " : ");
    }
    long largestOffset = validOffsets[0];
    long smallestOffset = validOffsets[validOffsets.length - 1];
    System.out.println(smallestOffset + " : " + largestOffset );
    return largestOffset;
}

这给了我以下输出:

4529948 : 6000878

因此,我提供的偏移量在偏移范围内。

1 个答案:

答案 0 :(得分:1)

对于迟到的回答感到抱歉,但是......

我通过使用Long实例var来保存下一个要读取的偏移量然后在获取之后进行检查以查看返回的FetchResponse是否具有错误()来编写这种情况。如果出现错误,我将下一个偏移值更改为合理值(可能是下一个偏移量或最后一个可用偏移量),然后重试。