有没有办法在storm中应用多个分组?

ryevplcw  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(468)

我想将“字段分组”以及“本地或随机分组”应用到我的拓扑中,这样每个喷口只向本地螺栓发送数据,而且还使用文档中的字段来决定它应该转到哪些本地螺栓。
因此,如果有两个工作进程,每个进程有1个Kafka喷口和2个ElasticSearch螺栓,则局部或随机分组会给出以下结果:

Each KS ---> Two local ES-Bolts

字段分组提供了以下信息:

Each KS ---> Possibly all 4 ES-bolts, depending on the value of the field

但我想要的是:

Each KS ---> Two local ES-bolts only, but distribution among these
             local bolts should depend on the value of the field

哪里:
ks=Kafka喷口
es=ElasticSearch
我想这样做,以便我可以为一个单一的碎片在es博尔特一起所有的文件。这样,es服务器将不会进一步拆分es bolt发送的批,因为所有这些文档的目标shard都是相同的(我计划将字段目标shard添加到文档以进行字段级分组,并且目标shard将计算为murrumm3.hash(id)%numshards)。
然后我不需要任何进程间通信,因此需要“本地或随机分组”
谢谢你的帮助!

gcuhipw9

gcuhipw91#

不,是的。
没有满足您需要的分组值,但您可以使用以下方法实现该分组:
1) 定向流,其中指定bolt示例的任务id来处理元组(而不是让storm来解决)
2) 拓扑上下文在启动时传递给每个螺栓和喷口。该对象可以告诉您当前工作进程上正在运行哪些任务(使用 getThisWorkerTasks() )什么螺栓有什么任务( getComponentTasks() )
3) 您自己的分区逻辑,如前面所述,它利用上面(2)中的信息为每个bolt的出站元组指定特定的目标任务。

相关问题