从Kafka检索基于时间戳的数据

时间:2016-09-15 14:50:38

标签: apache-kafka

如何在指定日期从Kafka群集获取消息或数据。例如9月13日,任何人都可以为此提供代码。我用Google搜索并发现只有理论,但我想要代码

3 个答案:

答案 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消息存储在另一个合适的数据库系统中,并使用时间戳作为索引。