如何在指定日期从Kafka群集获取消息或数据。例如9月13日,任何人都可以为此提供代码。我用Google搜索并发现只有理论,但我想要代码
答案 0 :(得分:30)
没有这种访问方法。此外,在Kafka class ClassDemo {
public static void main(String args[]) {
BufferedReader br = null;
try {
String intarray[] = new String[50]; /*declaring array for int */
String line, a, str = null;
char str1 = 0; /*declaring char str1*/
char str2[] = new char[20];
char str3 = 0; /*declaring char str1*/
char str4[] = new char[20];
br = new BufferedReader(new FileReader("c:/java/a.java")); /*loading file*/
while ((line = br.readLine()) != null) /*reading file*/ {
StringTokenizer stringTokenizer = new StringTokenizer(line); /*spliting the line into string*/
while (stringTokenizer.hasMoreElements()) /*checking more elememts*/
{
str = stringTokenizer.nextElement().toString();
if (str.equals("int"))/*compare for int*/ {
while (str1 != '(') {
str = stringTokenizer.nextElement().toString();
for (int i = 0; i < str.length(); i++) {
str1 = str.charAt(i);
str2[i] = str1;
System.out.println(str2[i]);
}
}
while (str3 != ';') {
str = stringTokenizer.nextElement().toString();
for (int i = 0; i < str.length(); i++) {
str3 = str.charAt(i);
str4[i] = str3;
System.out.println(str4[i]);
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null)
br.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
消息不包含任何时间戳信息之前,因此无法知道消息何时写入主题。
从Kafka v0.10
开始,每条消息都包含一个元数据时间戳属性,该属性由生产者在消息创建时设置,或由代理在消息插入时设置。计划基于时间的索引,但尚未提供。因此,您需要使用整个主题并检查时间戳字段(并忽略您不感兴趣的所有消息)。要找到开头,您还可以进行关于偏移和时间戳的二分搜索,以便更快地找到第一条消息。
<强>更新强>
Kakfa v0.10
添加了基于时间的索引。它允许0.10.1
到第一条记录,时间戳等于或大于给定时间戳。您可以通过seek
使用它。这将返回相应的偏移量,您可以将它们输入KafkaConsumer#offsetsForTime()
。您可以通过KafkaConsumer#seek()
使用数据并检查记录时间戳字段,以查看何时可以停止处理。
请注意,数据严格按偏移排序,但不是按时间戳排序。因此,在处理过程中,您可能会迟到&#34; 小于时间戳的记录比您的开始时间戳(您可以简单地跳过这些记录)。
更困难的问题是在搜索间隔结束时迟到的记录。在获得时间戳大于搜索间隔的第一个时间戳之后,可能仍会有时间戳记的记录,这些记录将在稍后的搜索间隔中显示(如果这些记录已附加到主题&#34;后期&#34;) 。但是,没有办法知道这一点。因此,您可能希望继续阅读&#34;更多&#34;记录并检查是否有&#34;迟到&#34;记录。多少&#34;一些记录&#34;意味着,是你自己需要做出的设计决定。
虽然没有一般的指导方针 - 如果你对你的&#34;写模式有更多的了解&#34;它可以帮助您定义一个好的策略,在您的搜索间隔结束后,您希望消费者记录多少记录&#34;。当然有两种默认策略:(1)停止在第一条记录中,时间戳大于搜索间隔(并有效地忽略任何迟到的记录 - 如果你使用&#34; log append time&#34;配置这是当然是一种安全的策略); (2)你读到日志的末尾 - 这是关于完整性的最安全的策略,但可能导致过高的开销(同时注意,因为记录可以随时附加,如果记录&#34;延迟&#34;可能是任意大的,在你到达日志结束后甚至可能会附加一个晚期记录。)
在实践中,考虑最大预期延迟可能是一个好主意。并且读取直到你得到一个时间戳大于这个上限延迟的记录。
答案 1 :(得分:2)
将此添加到当前命令中 --property print.timestamp=true 这将打印时间戳 CreateTime:1609917197764。
示例: bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicName --property print.timestamp=true --from-beginning
答案 2 :(得分:0)
从卡夫卡获取特定日期的数据效率不高,因为数据线性存储在每个经纪人的存储系统中的卡夫卡内部。因此,即使您在每条消息中都包含时间戳,或者使用kafka的消息元数据(可能在更高版本的kafka消息版本(> = 0.10)中包含时间戳),您仍必须扫描每个分区上的整个主题以获取数据。由于kafka中的数据不是按日期编入索引,而只是按偏移量编排。
记住,kafka是一个队列,而不是数据库。如果您想要这种基于日期的检索模式,则可能需要考虑将kafka消息存储在另一个合适的数据库系统中,并使用时间戳作为索引。