【问题标题】:How to scale Kafka Stream application如何扩展 Kafka Stream 应用程序
【发布时间】:2019-01-30 08:37:51
【问题描述】:

我对 kafka 文档中关于这个主题的措辞有点困惑,所以我想在这里问一下,我在这里对这些东西的解释是否正确?

因此,如果我正确理解这一点,扩展 Kafka Stream 应用程序的唯一方法是启动应用程序的新实例(或增加应用程序中的流线程数),这将确保在 consumerGroup( 'application.id'),所以我可以将我的流应用程序扩展到主题的分区数(实际上,如果我的流拓扑连接到多个主题,假设 TopicA 有 5 个分区,topicB 有 3 个我加入了流TopicA 和 TopicB,我猜在这种情况下我可以扩展到 3 个实例/线程)。

现在假设我有一个有 5 个分区的 topicA,我启动了我的应用程序的 3 个实例,如果我在拓扑中配置了 KTable,每个 KTable 都将包含来自某个分区的信息,我必须找出哪个实例上的元数据(分区)我的键是,所以当我启动第 4 个实例时会发生什么,假设实例 3 上的 KTable 的键/值现在可以转到实例 4 上的 KTable,不是吗?一个问题是这种重新平衡可以持续多长时间(我认为这取决于主题大小,所以假设需要 1 分钟,我正在查询 KTable 的应用程序会在此操作期间无响应吗?)

一个附带的问题,这种机制对于 'streamBuilder.table(..)' 和 'streambuilder.groupByKey(..).reduce(..)'' 的工作方式是否完全相同?

最后一个问题,同样是一个有 5 个分区的主题,但我没有启动应用程序的 3 个实例,而是启动了一个具有 3 个流线程的实例(num.stream.threads = 3),我将再次拥有代表 5 个分区的 3 个 KTable ,如果我将线程大小 3 更改为 4,它的行为是否与增加实例数完全相同?

谢谢解答..

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    假设 TopicA 有 5 个分区,topicB 有 3 个我加入了 TopicA 和 TopicB 的流,我猜我可以扩展到 3 在这种情况下是实例/线程)。

    首先,为了连接两个主题,它们应该有相同数量的分区。这是加入的关键要求。如果您有 5 个分区的主题 A 和 3 个分区的主题 B,它将永远不会执行连接。 (https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#join-co-partitioning-requirements)

    当我启动第四个实例时会发生什么,

    是的,Kafka 流将根据分区数重新平衡实例之间的工作负载。它将重新分配分区及其任务,包括本地状态存储。时间取决于主题大小。如果有最终用户查询 ktable,您应该更喜欢从所有实例中收集元数据并执行查找。

    这种机制对于 'streamBuilder.table(..)' 的工作方式是否完全相同? 和'streambuilder.groupByKey(..).reduce(..)''?

    是的,每当使用任何转换创建 ktable 时,都会遵循相同的机制。

    又是一个有 5 个分区的主题,但不是启动 3 个实例 应用程序,我用 3 个流线程启动了一个实例 (num.stream.threads = 3) 我会再有 3 个 KTable 代表 5 分区,它的行为是否与增加 如果我将线程大小 3 更改为 4,则实例数。

    默认情况下,Kafka Streams 会将拓扑分解为 5 个任务(=分区数)。如果 num.stream.threads 设置为 3,则这些任务将分布在指定的线程中。因此 thread-1 可以运行 2 个任务,thread-2 可以运行接下来的 2 个任务,thread-3 可以运行 1 个任务。
    KTable 状态将被划分为 5 个分片(=分区数),一个分片将映射到一项任务。因此,每个任务都将创建一个不包括自身的本地存储。这些本地存储包含相应分片的数据。尽管有线程数,但您将获得本地存储等于分区数。

    例子:

    再添加一个实例后

    【讨论】:

    • 因此,这意味着如果我有 3 个流应用程序实例而不是线程,那么对于具有 5 个分区的主题,我将获得 5 个流任务,这些任务将在 3 个实例之间共享。
    • 是的,5 个任务将分布在 3 个实例中。添加了清晰视图的示例。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2015-05-23
    • 2016-08-22
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多