kafka streams 如何让多个topic里相同的key数据被分配到同一个task

linfeng01 发布于 2018/11/02 18:58
阅读 762
收藏 1

使用kafka stream同时消费topic A, topicB.

A和B的分区数是一样的,A和B的每条数据的key也是一致的,A和B的分区策略也是一样的(使用默认的)。

现在使用kafka streaming client进行实时计算,因为我的client是多实例的,想让A和B里的key一样的数据能不同一个client消费到,请问该如何操作呢?

以下是在网上看到的,实际测试并不行:

网址:http://www.jasongj.com/kafka/kafka_stream/

如果要得到正确的计算结果,需要保证参与Join的KTable或KStream中Key相同的数据被分配到同一个Task。具体方法是

参与Join的KTable或KStream的Key类型相同(实际上,业务含意也应该相同)
参与Join的KTable或KStream对应的Topic的Partition数相同
Partitioner策略的最终结果等效(实现不需要完全一样,只要效果一样即可),也即Key相同的情况下,被分配到ID相同的Partition内

加载中
0
l
linfeng01

正文有点错误:想让A和B里的key一样的数据能让同一个client消费到,请问该如何操作呢?

0
Anur
Anur
kafka会对key取模去进行tp分配,但你是两个topic,partition都不一样,也就是tp顺序不一定相同,造成了这个结果。比如A 的顺序是 123,b的是132,取模都是第二个tp,但实际上不是同一个。 手动分区或许可以解决这个问题,等我肥家看看,或者楼主自己搜搜手动分区相关,或者等其他人回答
Anur
Anur
回复 @linfeng01 : KAFKA STREAM 的我不是很懂鸭 = =
l
linfeng01
大神,能帮解答下吗?看了RangeAssignor源码以及测试了下,普通的consumer消费没问题,符合预期,多个topic的key一样的也落在同一个client上。但用kafka-streams去消费的时候,就不符合预期了...即使显示指定partition.assignment.strategy这个参数,测试了一个topic20个分区,两个client场景,结果却是一个消费11个一个消费9个
l
linfeng01
两个topic的分区数一样的,并且也手动调过了。图片见下面的一条评论
0
l
linfeng01

回答二楼的,这个是我的两个topic的分区情况,下面的图是通过kafkamanger看到的实际消费的情况

返回顶部
顶部