Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从特定主题检索Kafka消费者的最后n条消息_Java_Apache Kafka_Kafka Consumer Api_Kafka Records - Fatal编程技术网

Java 从特定主题检索Kafka消费者的最后n条消息

Java 从特定主题检索Kafka消费者的最后n条消息,java,apache-kafka,kafka-consumer-api,kafka-records,Java,Apache Kafka,Kafka Consumer Api,Kafka Records,卡夫卡版本:0.9.0.1 如果n=20, 我必须得到一个主题的最后20条消息 我试过了 kafkaConsumer.seektobegining(); 但它检索所有消息。我只需要收到最后20条信息 此主题可能有数十万条记录 公共列表消息(字符串kafkaTopicName){ KafkaConsumer KafkaConsumer=null; 布尔标志=真; List messagesFromKafka=new ArrayList(); int recordCount=0; int i=0;

卡夫卡版本:0.9.0.1

如果
n=20
, 我必须得到一个主题的最后20条消息

我试过了

kafkaConsumer.seektobegining();
但它检索所有消息。我只需要收到最后20条信息

此主题可能有数十万条记录

公共列表消息(字符串kafkaTopicName){
KafkaConsumer KafkaConsumer=null;
布尔标志=真;
List messagesFromKafka=new ArrayList();
int recordCount=0;
int i=0;
int maxMessagesToReturn=20;
Properties props=新属性();
put(“bootstrap.servers”,“localhost:9092”);
props.put(“group.id”、“project.group.id”);
put(“max.partition.fetch.bytes”,“1048576000”);
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
卡夫卡消费者=新卡夫卡消费者(道具);
订阅(Arrays.asList(kafkaTopicName));
TopicPartition TopicPartition=新的TopicPartition(kafkaTopicName,0);
LOGGER.info(“订阅主题”+kafkaConsumer.listTopics());
while(旗帜){
//将使用所有消息并存储在记录中
消费者记录记录=kafkaConsumer.poll(1000);
卡夫卡消费(主题划分);
//获取总记录计数
recordCount=records.count();
LOGGER.info(“记录计数”+记录计数);
对于(消费者记录:记录){
if(record.value()!=null){
如果(i>=recordCount-maxMessagesToReturn){
//将最后20条消息添加到messagesFromKafka
LOGGER.info(“kafkaMessage”+record.value());
messagesFromKafka.add(新的JSONObject(record.value());
}
i++;
}
}
如果(记录计数>0){
flag=false;
}
}
kafkaConsumer.close();
卡夫卡回信;
}

您可以使用
kafkaConsumer.seekToEnd(集合分区)
查找给定分区的最后一个偏移量。根据文件:

查找每个给定分区的最后一个偏移量。此函数的计算是惰性的,仅当调用
poll(Duration)
position(TopicPartition)
时,才查找所有分区的最终偏移量。如果没有提供分区,则查找当前分配的所有分区的最终偏移量

然后可以使用
位置(TopicPartition partition)
检索特定分区的位置

然后可以从中减少20条,并使用
kafkaConsumer.seek(TopicPartition,long offset)
获取最近的20条消息

简单地说

kafkaConsumer.seekToEnd(partitionList);
long endPosition = kafkaConsumer.position(topicPartiton);
long recentMessagesStartPosition = endPosition - maxMessagesToReturn;
kafkaConsumer.seek(topicPartition, recentMessagesStartPosition);
现在,您可以使用
poll()


这是一个简单的逻辑,但是如果你有多个分区,那么你也必须考虑这些情况。我没有试过这个,但希望你能理解这个概念

注:成千上万的读者不会理解“成千上万”一词。(平均来说,在接下来的几年里,你不应该期望超过几百人真正阅读你的问题,也就是说)此外:你看到了吗???我会假设:当
kafka simple consumer shell.sh
可以为您提供first、next、last。。。话题。。。那么也应该有一个API。我正在尝试这些API,我没有找到任何@GhostCat。将尝试使其更简单,您只想使用最近的20条消息吗?或者每次投票最多只能得到20条记录?只是最近的20条@deadpool我没有得到最后的20条。快20岁了。假设我的记录是100000。我得到的记录像61421-61441。但是我想要99980-100000。我增加了“max.partition.fetch.bytes”的值,然后从82525到82845。无论“max.partition.fetch.bytes”如何,它都应该工作value@praveenkumar尝试使自动提交成为现实。同样,这也不是完美的解决方案。首先,endPosition不是最后一条记录的偏移量,而是下一条新记录的位置。第二个问题是逻辑最多返回20条记录。偏移中存在间隙的原因有很多。但是最大的问题是poll():调用poll()时应该使用多长时间?一秒钟可能给你零记录,一分钟意味着你一直在等一分钟。