我有一个典型的samza任务,它包含两个主题: data
以及 config
,并存储来自 config
作为rocksdb中的本地状态来检查来自 data
你没事吧。
如果这两个主题中的每一个都只有一个分区,则此任务可以正常工作。一旦我分手 data
分成十个分区 config
仍然是一个分区,事情变了。默认情况下,samza创建10个任务来使用分区0~9 data
主题,仅任务0使用 config
主题: task[0] -> config, data[0] task[1] -> data[1] ... task[9] -> data[9]
似乎每个任务都是用自己的rocksdb示例初始化的,所以只有任务[0]在rocksdb示例中存储了所有的配置数据,任务[1~9]没有配置数据,因此找不到传入数据的配置信息。
我所期望的是,每个任务都使用来自其数据分区和配置流的消息,如下所示: task[0] -> config, data[0] task[1] -> config, data[1] ... task[9] -> config, data[9]
有没有办法做到这一点?
1条答案
按热度按时间kt06eoxx1#
输入流分区的分布由使用“job.systemstreampartition.grouper.factor”配置的可插入grouper控制。默认情况下,此类跨任务示例对传入流分区进行分组。默认情况下,我认为它是groupbypartitionid。这就是为什么您在任务[0]中看到数据[0]和配置[0]。
可以实现自定义sspgrouper。然而,您需要的是将“data”流视为常规输入流,将“config”流视为“broadcast”输入流。广播意味着samza作业中的每个任务都从这个流的分区中读取。这样,每个任务示例都可以用配置流的数据填充其本地rocksdb。您可以将广播流配置为:
task.broadcast.inputs=<systemName>.<streamName>#[<partition-range>], <systemName>.<streamName>#[<partition-range>]
对于您的情况,您可以配置:task.inputs = <systemName>.data task.broadcast.inputs = <systemName>.config#0
查看samza中的广播流