Kafka Streams如何使用包含不完整数据的分区?

时间:2017-11-03 21:51:00

标签: apache-kafka apache-kafka-streams

Kafka Streams引擎将分区映射到一个工作者(即Java App),以便该分区中的所有消息都由该工作者处理。我有以下情况,并试图了解它是否仍然可行。

我有一个主题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

但是,由于每个工作人员只看到1个分区,因此每个汽车模型只会看到部分信息。它将错过来自其他分区的同一车型的数据。

问题:我的理解是否正确?

如果是的话,我可以想象我可以通过carModel对我的数据进行重新分区(即重新洗牌),以便这个用例工作。

但我只是想确保我不会误解它是如何工作的,事实上Kafka在我的应用程序中进行内部映射之后会神奇地处理重新分区。

2 个答案:

答案 0 :(得分:10)

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()的调用添加到您的代码中。

答案 1 :(得分:-2)

您可以使用具有同步增量(String carModel)函数的单例对象....从3个线程访问此单例对象并增加每个模型的出现次数。