【问题标题】:How does Kafka Streams work with Partitions that contain incomplete Data?Kafka Streams 如何处理包含不完整数据的分区?
【发布时间】:2018-04-16 17:22:12
【问题描述】:

Kafka Streams 引擎将一个分区映射到一个工作人员(即 Java 应用程序),以便该分区中的所有消息都由该工作人员处理。我有以下场景,并试图了解它是否仍然可行。

我有一个主题 A(有 3 个分区)。发送给它的消息由 Kafka 随机分区(即没有密钥)。我发送给它的消息具有如下架构

{carModel: "Honda", color: "Red", timeStampEpoch: 14334343342}

由于我有 3 个分区,并且消息在它们之间随机分区,同一型号的汽车可以写入不同的分区。例如

P1
{carModel: "Honda", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Honda", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Toyota", color: "Blue", timeStampEpoch: 14334343342}

P2
{carModel: "Toyota", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Honda", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Nissan", color: "Blue", timeStampEpoch: 14334343342}

P3
{carModel: "Nissan", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Honda", color: "Red", timeStampEpoch: 14334343342}
{carModel: "Nissan", color: "Blue", timeStampEpoch: 14334343342}

现在假设我想计算carModel 看到的汽车总数。我编写了一个 Kafka Streams 应用程序,它监听主题 A,通过 carModel 映射消息,即

carStream.map((key, value) -> KeyValue.pair(value["carModel"], value))

并将总数写入另一个主题 B,形式为

的消息
{carModel: "Nissan", totalCount: 5}

然后我启动它的 3 个实例,它们都属于同一个消费者组。然后,Kafka 将有效地将每个分区映射到其中一个工作人员。示例

P1 --> Worker A
P2 --> Worker B
P3 --> Worker C

但是,由于每个 Worker 只能看到 1 个分区,因此它只能看到每个车型的部分信息。它将丢失来自其他分区的同一车型的数据。

问题:我的理解正确吗?

如果是这样,我可以想象我可以通过 carModel 重新分区(即重新洗牌)我的数据以使这个用例正常工作。

但我只是想确保我没有误解它的工作原理,事实上 Kafka 确实以某种方式神奇地处理了我在应用程序中进行内部映射后的重新分区。

【问题讨论】:

    标签: apache-kafka apache-kafka-streams


    【解决方案1】:

    Kafka Streams 会自动对您的数据进行重新分区。您的程序将类似于:

    stream.map(...).groupByKey().count();
    

    对于这种模式,Kafka Streams 检测到您在 map 中设置了一个新键,因此将在后台自动创建一个主题来为 groupByKey().count() 步骤重新分区数据(从 v0.10.1 开始,通过 KAFKA-3561 )。

    注意,map()“标记”需要重新分区的流,.groupByKey().count() 将创建重新分区的主题。在这方面,重新分区是“惰性的”,即仅在需要时才进行。如果没有.groupByKey().count(),则不会引入重新分区。

    基本上,上面的程序的执行方式与

    stream.map(...).through("some-topic").groupByKey().count();
    

    Kafka Streams 自动“插入”through() 步骤,从而计算出正确的结果。

    如果您使用的是 Kafka Streams 0.10.0,则需要手动创建具有所需分区数量的重新分区主题,并且还需要将对 through() 的调用添加到您的代码中。

    【讨论】:

    • 谢谢。这是我想知道的。
    猜你喜欢
    • 2018-04-28
    • 2018-10-08
    • 1970-01-01
    • 2020-12-16
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多