【问题标题】:Kafka repartitioning ( for group by based on key)卡夫卡重新分区(基于键的分组)
【发布时间】:2020-10-20 02:45:17
【问题描述】:

当我们基于某个键对流应用分组函数时,kafka 如何计算这一点,因为相同的键可能存在于不同的分区中?我看到了 through() 函数,它基本上对数据进行了重新分区,但我不明白这是什么意思。它会将具有相同密钥的所有消息移动到单个分区中吗?另外,我们可以多久调用一次 through() 方法?如果有需求,我们可以在收到每条消息后调用它吗?请建议。 谢谢

【问题讨论】:

    标签: apache-kafka apache-kafka-streams ktable


    【解决方案1】:

    Kafka 中的数据(默认情况下)总是按键分区。如果调用groupBy(),分组属性设置为消息键,因此,当数据写入重新分区主题时,具有相同键的所有记录都会写入同一个分区。因此,在读回数据时,可以在aggregate() 函数中正确计算聚合。

    请注意,Kafka Streams 会自动执行此重新分区(包括创建所需主题)。调用repartition()(或through())可以达到同样的效果,但这不是必需的。

    另请注意,Kafka Streams 程序是一个数据流程序。使用 DSL 时,您只需指定数据流程序本身,但尚未处理任何内容。只有当你调用KafkaStreams#start()时才会执行数据流程序。

    【讨论】:

    • 感谢您的信息。我仍然想知道在 KEY(自动或通过())上发生重新分区后,一个键的所有消息是否都移动到单个分区?经常使用这种重新分区是否安全?
    • 如答案所述:all records with the same key are written into the same partition -- 不确定您所说的“安全”是什么意思?
    • 由于重新分区是一项昂贵的操作,如果在处理每条消息的过程中执行此操作是否可以?
    • 嗯,有一些开销。但是主题并没有被多次重新分区。每条消息都被写入重新分区主题一次,并读回一次。不是多次。
    • 我有同样的问题,让我感到困惑的是在生产者和代理端将记录写入正确的分区,但在消费者端调用groupBy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多