我正在关注Kafka Streams文档,并对某些概念感到困惑,我想在这里澄清。
https://kafka.apache.org/23/documentation/streams/developer-guide/dsl-api.html
在阅读文档中提到的flatMap时,它需要一条记录并产生零个,一个或多个记录。您也可以修改记录键和值。它还标记了要重新分区的数据。
问题:
1)重新分区是什么意思,它将重新分区新主题的数据,我将在其中写入转换后的结果,还是将其重新分区到同一主题,从此我开始流式传输?
2)如果要对旧主题数据进行重新分区,这是否也意味着转换后的结果也要写入该主题?
例如:
df4 %>%
left_join(df1 %>%
group_by(Person, Day, Shift) %>%
summarise(num.cases = n()),
by = c("Person", "Day", "Shift"))
在此示例中,它正在获取一条记录并生成两条记录,这是否意味着我已经从中开始流式传输的主题现在将具有3条记录,其中一条使用键345L,另外两条使用HELLO。如果我将转换后的结果放到新主题或商店中,那么旧主题和新主题的状态将是什么。两个表都将包含所有3个记录。我是新手。
答案 0 :(得分:1)
这是一个转换的结果。因此,当您阅读主题时,无需更改源主题。但是,当您写入另一个主题时,您的输出接收器主题将具有2个值。
当它说它标记为要重新分区时,它将标记结果为要重新分区,并且当您写到接收器主题时,就必须重新分区。它不会重新划分源主题。想想为什么?
如果您一直在阅读源主题,它将持续对源主题进行重新划分吗?因此,这不是实际的选择。 我希望这可以澄清您的问题。
答案 1 :(得分:1)
在Kafka Steams中重新分区意味着将记录发送到处理器之前的中间主题,然后处理器从中间主题读取记录。通过将记录发送到中间主题,可以对记录进行重新分区。
这是必需的,例如对于连接处理器。 Kafka Streams中的联接处理器要求同一任务处理一个分区的所有键,以确保正确性。如果上游处理器像您的示例flatMap()
那样修改了记录的键,那将不是事实。除联接外,聚合还要求一个分区的所有键都由同一任务处理。重新分区不会将任何内容写入流应用程序的输入或输出主题,并且您通常不需要关心中间主题。
但是,您可以做的是,如果不更改记录键,则可以使用*Values()
之类的flatMapValues()
运算符来避免重新分区。例如,如果您使用flatMap()
并且没有更改记录的键,尽管不需要,记录仍将被重新分区。如果您不使用flatMapValues()
,则Kafka Streams无法知道您没有触摸按键。