首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何理解Kafka流?

如何理解Kafka流?
EN

Stack Overflow用户
提问于 2019-09-29 07:59:55
回答 2查看 220关注 0票数 0

我正在遵循Kafka streams文档,我对一些概念感到困惑,我想在这里澄清这些概念。

https://kafka.apache.org/23/documentation/streams/developer-guide/dsl-api.html

在阅读文档中提到的flatMap时,它采用一条记录并生成零条、一条或多条记录。您还可以修改记录键和值。它还标记要重新分区的数据。

问题:

1)重新划分是什么意思,是为新的主题重新划分数据,还是重新划分同一主题中的数据,从哪里开始流式传输?

2)如果旧的主题数据被重新划分,这是否意味着转换后的结果也将写入该主题?

例如:

代码语言:javascript
复制
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条记录。我是新手。

EN

回答 2

Stack Overflow用户

发布于 2019-09-29 11:18:39

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

当它说它标记为重新分区时,它会将结果标记为重新分区,而当您写入接收器主题时,它将不得不重新分区。它不会重新划分源主题。想一想为什么?

如果你不断地读取源主题,它会不断地重新划分源主题吗?所以,这不是一个实际的选择。我希望这能澄清你的问题。

票数 1
EN

Stack Overflow用户

发布于 2019-10-01 16:15:59

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58151165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档