Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka samza任务如何使用多个kafka分区流_Apache Kafka_Partition_Apache Samza - Fatal编程技术网

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

Apache kafka samza任务如何使用多个kafka分区流,apache-kafka,partition,apache-samza,Apache Kafka,Partition,Apache Samza,我有一个典型的samza任务,它使用两个主题:data和config,并将来自config的消息作为本地状态存储在rocksdb中,以检查来自data的消息是否正常 如果这两个主题中的每个主题只有一个分区,则此任务可以正常工作。一旦我将数据分割成十个分区,而配置仍然是一个分区,事情就变了。默认情况下,samza创建十个任务来使用数据的分区0~9主题,只有任务0使用config主题: 任务[0]->配置,数据[0] 任务[1]->数据[1] ... 任务[9]->数据[9] 似乎每个任务都是用

我有一个典型的samza任务,它使用两个主题:
data
config
,并将来自
config
的消息作为本地状态存储在rocksdb中,以检查来自
data
的消息是否正常

如果这两个主题中的每个主题只有一个分区,则此任务可以正常工作。一旦我将
数据
分割成十个分区,而
配置
仍然是一个分区,事情就变了。默认情况下,samza创建十个任务来使用
数据的分区0~9
主题,只有任务0使用
config
主题:


任务[0]->配置,数据[0]
任务[1]->数据[1]
...
任务[9]->数据[9]

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

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


任务[0]->配置,数据[0]
任务[1]->配置,数据[1]
...
任务[9]->配置,数据[9]


有什么方法可以实现这一点吗?

输入流分区的分布由使用“job.systemstreampartition.grouper.factor”配置的可插入grouper管理。默认情况下,此类跨任务实例对传入流分区进行分组。默认情况下,我相信它会执行GroupByPartitionId。这就是为什么您在任务[0]中看到数据[0]和配置[0]

您可以实现自定义SSPGrouper。然而,您需要的是将“数据”流视为常规输入流,将“配置”流视为“广播””输入流。广播意味着Samza作业中的每个任务都从该流的分区读取。这样,每个任务实例都可以用配置流的数据填充其本地rocksdb。您可以将广播流配置为:
task.broadcast.inputs=.#[],.#[]

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


签出

输入流分区的分布由使用“job.systemstreampartition.grouper.factor”配置的可插入grouper管理。默认情况下,此类跨任务实例对传入流分区进行分组。默认情况下,我相信它会执行GroupByPartitionId。这就是为什么您在任务[0]中看到数据[0]和配置[0]

您可以实现自定义SSPGrouper。然而,您需要的是将“数据”流视为常规输入流,将“配置”流视为“广播””输入流。广播意味着Samza作业中的每个任务都从该流的分区读取。这样,每个任务实例都可以用配置流的数据填充其本地rocksdb。您可以将广播流配置为:
task.broadcast.inputs=.#[],.#[]

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


检查

根据@NavinaRamesh的建议,我遇到了一个异常:
线程“main”java.lang.IllegalArgumentException中的异常:kafka.config#[0]中的格式不正确。广播流名称的格式应为“system.stream#partitionId”或“system.stream#[partitionN partitionM]”
,这意味着正确的格式应为
task.Broadcast.inputs=.config#0
,在我更改为正确的格式后,一切都像一个魔咒一样工作。谢谢,干杯,@NavinaRamesh:)很高兴你能弄明白:)我在回复中修正了配置格式。谢谢根据@NavinaRamesh的建议,我遇到了一个异常:
线程“main”java.lang.IllegalArgumentException中的异常:kafka.config#[0]中的格式不正确。广播流名称的格式应为“system.stream#partitionId”或“system.stream#[partitionN partitionM]”
,这意味着正确的格式应为
task.Broadcast.inputs=.config#0
,在我更改为正确的格式后,一切都像一个魔咒一样工作。谢谢,干杯,@NavinaRamesh:)很高兴你能弄明白:)我在回复中修正了配置格式。谢谢