KStreams 确定哪个输入记录时间戳元数据在连接上持久化
KStreams Determining which input record timestamp metadata is persisted on joins
希望有人知道这一点或者能给我指出正确的方向...
我有一个通过 API REST 请求创建的数据主题。 REST 请求中收到的字段之一是记录 EventTime 的时间戳。这些记录被生成到 Kafka,EventTime 被设置为记录的元数据时间戳。
我有另一个规则主题,它提供的信息通过向接收到的值添加新字段来扩充数据主题记录。
这两个主题都有匹配的加入键。
我的目标是在使用处理器 API 的所有处理阶段中保留数据主题中的 EventTime。请注意,将有多个不同的 KStreams 应用程序 process/augment 此数据在多个 ways/steps.
中
好消息是,我已经看到很多表明在使用 Kafka Streams 时输入记录时间戳被保留的情况。
如:
- https://kafka.apache.org/documentation/streams/core-concepts#streams_time
- input record timestamp and output record timestamp is same across both source and sink topics?
并且也一直在阅读时间戳提取器:
关于加入的更多信息:
- https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Join+Semantics
- https://kafka.apache.org/documentation/streams/developer-guide/dsl-api.html#kstream-globalktable-join
在很多 Streams 文档中,我看到它提到了 "the timestamp for the input record will persist to the output record",但我不清楚它在连接时是如何工作的。
我的困惑似乎是,当我们加入时,我们有 2 个不同的输入记录,并且正在生成一个输出记录。
如何确定在联接中使用的多个输入记录之间保留哪个时间戳?
我一直在和同事讨论,有如下几种观点
- 加入的输入记录的最早非负时间戳是
坚持。
- 左侧输入记录的时间戳被保留,例如
leftStream.join(rightStream, ...);
- 触发连接的输入记录的时间戳(左或
对)
- 它是非确定性的,因此使用挂钟时间,除非为生产者指定了时间戳提取器。
其中一些比其他的有更好的论据,但我需要知道实际发生了什么...
如有任何帮助或有关查找位置的建议,我们将不胜感激。
目前(即 Kafka 2.0 版本)没有 public 合约将使用哪个时间戳,并且允许实现使用任何策略。当前实现使用触发连接计算的记录的时间戳。
作为解决方法,您可以通过在联接后添加 .valueTransformer()
来操纵时间戳。比较 https://cwiki.apache.org/confluence/display/KAFKA/KIP-251%3A+Allow+timestamp+manipulation+in+Processor+API
即需要在join前将原始时间戳嵌入到value payload中,join后提取并设置为metadata timestamp。
希望有人知道这一点或者能给我指出正确的方向...
我有一个通过 API REST 请求创建的数据主题。 REST 请求中收到的字段之一是记录 EventTime 的时间戳。这些记录被生成到 Kafka,EventTime 被设置为记录的元数据时间戳。
我有另一个规则主题,它提供的信息通过向接收到的值添加新字段来扩充数据主题记录。
这两个主题都有匹配的加入键。
我的目标是在使用处理器 API 的所有处理阶段中保留数据主题中的 EventTime。请注意,将有多个不同的 KStreams 应用程序 process/augment 此数据在多个 ways/steps.
中好消息是,我已经看到很多表明在使用 Kafka Streams 时输入记录时间戳被保留的情况。
如:
- https://kafka.apache.org/documentation/streams/core-concepts#streams_time
- input record timestamp and output record timestamp is same across both source and sink topics?
并且也一直在阅读时间戳提取器:
关于加入的更多信息:
- https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Streams+Join+Semantics
- https://kafka.apache.org/documentation/streams/developer-guide/dsl-api.html#kstream-globalktable-join
在很多 Streams 文档中,我看到它提到了 "the timestamp for the input record will persist to the output record",但我不清楚它在连接时是如何工作的。
我的困惑似乎是,当我们加入时,我们有 2 个不同的输入记录,并且正在生成一个输出记录。
如何确定在联接中使用的多个输入记录之间保留哪个时间戳?
我一直在和同事讨论,有如下几种观点
- 加入的输入记录的最早非负时间戳是 坚持。
- 左侧输入记录的时间戳被保留,例如
leftStream.join(rightStream, ...);
- 触发连接的输入记录的时间戳(左或 对)
- 它是非确定性的,因此使用挂钟时间,除非为生产者指定了时间戳提取器。
其中一些比其他的有更好的论据,但我需要知道实际发生了什么...
如有任何帮助或有关查找位置的建议,我们将不胜感激。
目前(即 Kafka 2.0 版本)没有 public 合约将使用哪个时间戳,并且允许实现使用任何策略。当前实现使用触发连接计算的记录的时间戳。
作为解决方法,您可以通过在联接后添加 .valueTransformer()
来操纵时间戳。比较 https://cwiki.apache.org/confluence/display/KAFKA/KIP-251%3A+Allow+timestamp+manipulation+in+Processor+API
即需要在join前将原始时间戳嵌入到value payload中,join后提取并设置为metadata timestamp。