【问题标题】:Kafka streams: stream threads vs storeKafka 流:流线程与存储
【发布时间】:2018-06-06 04:43:49
【问题描述】:

假设我们有一个实例,其配置如下,并在商店中维护状态。

主题 - 1
分区 - 6
num.stream.threads - 6

拓扑
来源 - 1
低级处理器 - 3 个(每日、每月和每年各一个处理器 聚合)
水槽 - 3

  • 使用上述拓扑和主题分区可以执行多少个并行任务?
  • 如果为 Daily 处理器分配了 2 个并行任务,并且如果标点符号计划每 30 分钟运行一次,并且在我们将所有存储转发到接收器 1 的覆盖中,键值存储会是两次发布到接收器,因为 2 个并行任务共享同一个存储,或者每个任务都有自己的存储,并且只会发布与它们分配的分区相对应的数据,这些分区被持久保存在各自的存储中?

    KeyValueIterator<String, House> keyValueIterator = houseStore.all();
    while (keyValueIterator.hasNext()) {
        KeyValue<String, House> next = keyValueIterator.next();
        context.forward(next.key, next.value);
    }
    keyValueIterator.close();
    
  • 如果我们改为使用 KTable(每天、每月和每年聚合一个)高级 DSL,将会有多少任务?是否可以有两个并行任务更新同一个 KTable(比如每天)?

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    Kafka Streams 将创建 6 个任务,因为源主题有 6 个分区。状态,将被划分为 6 个分片,每个任务一个分片。因此,任务中的本地存储是任务专有的,仅包含相应分片的数据。如果您按任务扫描整个商店,您将不会在输出主题中获得重复数据,因为每个分片中的数据不同。

    【讨论】:

    • 太棒了,非常感谢。这有助于满足我的要求:)
    • 嗨,Matthias,很抱歉还有一个问题可以让您了解整个流程。我假设每个存储只有一个内部主题,所以关于维护存储中的分片的任务,当需要从内部主题恢复状态时它是如何工作的,这意味着来自内部主题的数据的哪一部分应该进入哪些分片,是基于内部主题的分区吗?
    • 是的,它基于主题分区。更改日志主题创建的分区数与共享分区数相同,并且一个分片的所有数据恰好进入一个分区,即,它是 1:1 映射。因此,恢复一个分片意味着从相应的更改日志主题分区中重新读取所有数据。
    • 感谢 Matthias,这是状态处理的关键信息。这些细节有官方文档吗?
    • 它没有很好地记录,因为它是一个实现细节。 docs.confluent.io/current/streams/architecture.html 可能会部分介绍我——也有一些关于 Kafka Streams 的 Kafka 峰会会谈对此进行了解释:confluent.io/resources
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多