如何理解卡夫卡流?

时间:2019-09-28 23:59:54

标签: apache-kafka apache-kafka-streams

我正在关注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个记录。我是新手。

2 个答案:

答案 0 :(得分:1)

这是一个转换的结果。因此,当您阅读主题时,无需更改源主题。但是,当您写入另一个主题时,您的输出接收器主题将具有2个值。

当它说它标记为要重新分区时,它将标记结果为要重新分区,并且当您写到接收器主题时,就必须重新分区。它不会重新划分源主题。想想为什么?

如果您一直在阅读源主题,它将持续对源主题进行重新划分吗?因此,这不是实际的选择。 我希望这可以澄清您的问题。

答案 1 :(得分:1)

在Kafka Steams中重新分区意味着将记录发送到处理器之前的中间主题,然后处理器从中间主题读取记录。通过将记录发送到中间主题,可以对记录进行重新分区。

这是必需的,例如对于连接处理器。 Kafka Streams中的联接处理器要求同一任务处理一个分区的所有键,以确保正确性。如果上游处理器像您的示例flatMap()那样修改了记录的键,那将不是事实。除联接外,聚合还要求一个分区的所有键都由同一任务处理。重新分区不会将任何内容写入流应用程序的输入或输出主题,并且您通常不需要关心中间主题。

但是,您可以做的是,如果不更改记录键,则可以使用*Values()之类的flatMapValues()运算符来避免重新分区。例如,如果您使用flatMap()并且没有更改记录的键,尽管不需要,记录仍将被重新分区。如果您不使用flatMapValues(),则Kafka Streams无法知道您没有触摸按键。