我有一个典型的 samza 任务,它消耗 2 个主题:data
和 config
,并将来自config
的消息作为本地状态存储在 rocksdb 中,以检查来自data
的消息是否正常。
如果这两个主题中的每一个只有一个分区,则此任务工作正常。一旦我data
分成十个分区,config
仍然是一个分区,情况就发生了变化。默认情况下,samza 创建 10 个任务来消耗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]
有什么办法可以做到这一点吗?
输入流分区的分布由使用"job.systemstreampartition.grouper.factor"配置的可插拔石斑鱼控制。默认情况下,此类跨任务实例对传入流分区进行分组。默认情况下,我相信它做一个GroupByPartitionId。这就是为什么你在任务[0]中看到数据[0]和配置[0]的原因。
您可以实现自定义 SSPGrouper。但是,您要查找的是将"数据"流视为常规输入流,将"配置"流视为">广播"输入流。广播意味着 Samza 作业中的每个任务都从此流的分区读取。这样,每个任务实例都可以用配置流的数据填充其本地 rocksdb。您可以将广播流配置为: task.broadcast.inputs=<systemName>.<streamName>#[<partition-range>], <systemName>.<streamName>#[<partition-range>]
对于您的情况,您可以配置: task.inputs = <systemName>.data
task.broadcast.inputs = <systemName>.config#0
查看萨姆扎的广播流