我正在遵循Kafka streams文档,我对一些概念感到困惑,我想在这里澄清这些概念。
https://kafka.apache.org/23/documentation/streams/developer-guide/dsl-api.html
在阅读文档中提到的flatMap时,它采用一条记录并生成零条、一条或多条记录。您还可以修改记录键和值。它还标记要重新分区的数据。
问题:
1)重新划分是什么意思,是为新的主题重新划分数据,还是重新划分同一主题中的数据,从哪里开始流式传输?
2)如果旧的主题数据被重新划分,这是否意味着转换后的结果也将写入该主题?
例如:
KStream<Long, String> stream = ...;
KStream<String, Integer> transformed = stream.flatMap(
// Here, we generate two output records for each input record.
// We also change the key and value types.
// Example: (345L, "Hello") -> ("HELLO", 1000), ("hello", 9000)
(key, value) -> {
List<KeyValue<String, Integer>> result = new LinkedList<>();
result.add(KeyValue.pair(value.toUpperCase(), 1000));
result.add(KeyValue.pair(value.toLowerCase(), 9000));
return result;
}
);在这个例子中,它获取了一条记录并生成了两条记录,这是否意味着我开始流式传输的主题现在将有3条记录,一条关键字为345L,两条记录为HELLO。如果我将转换后的结果放到一个新的主题或存储中,那么新旧主题的状态会是什么。这两个表都将包含所有3条记录。我是新手。
发布于 2019-09-29 11:18:39
这是一个转换后的结果。因此,当你阅读一个主题时,你不会改变源主题。但是,当您写入另一个主题时,您的输出接收器主题将具有2个值。
当它说它标记为重新分区时,它会将结果标记为重新分区,而当您写入接收器主题时,它将不得不重新分区。它不会重新划分源主题。想一想为什么?
如果你不断地读取源主题,它会不断地重新划分源主题吗?所以,这不是一个实际的选择。我希望这能澄清你的问题。
发布于 2019-10-01 16:15:59
Kafka Steams中的重新分区意味着在处理器之前将记录发送到中间主题,然后处理器从中间主题读取记录。通过将记录发送到中间主题,记录被重新分区。
这是必需的,例如,对于连接处理器。Kafka Streams中的join处理器要求一个分区的所有键都由同一个任务处理,以确保正确性。如果上游处理器像您的示例flatMap()那样修改了记录的键,这就不是真的了。除了连接之外,聚合还要求一个分区的所有键都由同一任务处理。重新分区不会向streams应用程序的输入或输出主题写入任何内容,并且通常不需要关心中间主题。
但是,如果不更改记录的键,则可以通过使用flatMapValues()等*Values()运算符来尽可能避免重新分区。例如,如果您使用flatMap()并且不更改记录的键,则记录将被重新分区,尽管不需要这样做。如果您不使用flatMapValues(),Kafka Streams不会知道您没有触摸按键。
https://stackoverflow.com/questions/58151165
复制相似问题