如何使用samza任务消耗多个kafka分区流

时间:2017-03-23 09:07:09

标签: apache-kafka partition apache-samza

我有一个典型的samza任务,它消耗了2个主题:dataconfig,并将来自config的消息作为本地状态存储在rocksdb中,以检查来自data的消息没事。

如果这两个主题中的每一个只有一个分区,则此任务可以正常工作。将data拆分为十个分区并且config仍然是一个分区后,事情发生了变化。默认情况下,samza创建十个任务来使用data主题的0~9分区,只有任务0使用config主题:

task[0] -> config, data[0] task[1] -> data[1] ... task[9] -> data[9]

似乎每个任务都使用自己的rocksdb实例初始化,因此只有task [0]将所有配置数据存储在其rocksdb实例中,task [1~9]没有配置数据,因此无法找到配置信息传入的数据。

我的期望是每个任务消耗来自其数据分区和配置流的消息,如下所示:

task[0] -> config, data[0] task[1] -> config, data[1] ... task[9] -> config, data[9]

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:4)

输入流分区的分布由可插拔分组器控制,该分组器使用" job.systemstreampartition.grouper.factor"进行配置。默认情况下,此类将任务实例中的传入流分区分组。默认情况下,我相信它会执行GroupByPartitionId。这就是你在任务[0]中看到data [0]和config [0]的原因。

您可以实施自定义SSPGrouper。但是,你要找的是对待数据&#34; stream作为常规输入流和&#34; config&#34;流作为&#34; 广播&#34;输入流。广播意味着Samza作业中的每个任务都从此流的分区中读取。这样,每个任务实例都可以使用配置流填充其本地rocksdb&#39;数据。您可以将广播流配置为: task.broadcast.inputs=<systemName>.<streamName>#[<partition-range>], <systemName>.<streamName>#[<partition-range>]

对于您的情况,您可以配置: task.inputs = <systemName>.data task.broadcast.inputs = <systemName>.config#0

查看Broadcast Streams in Samza