我想将“字段分组”以及“本地或随机分组”应用到我的拓扑中,这样每个喷口只向本地螺栓发送数据,而且还使用文档中的字段来决定它应该转到哪些本地螺栓。
因此,如果有两个工作进程,每个进程有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)。
然后我不需要任何进程间通信,因此需要“本地或随机分组”
谢谢你的帮助!
1条答案
按热度按时间gcuhipw91#
不,是的。
没有满足您需要的分组值,但您可以使用以下方法实现该分组:
1) 定向流,其中指定bolt示例的任务id来处理元组(而不是让storm来解决)
2) 拓扑上下文在启动时传递给每个螺栓和喷口。该对象可以告诉您当前工作进程上正在运行哪些任务(使用
getThisWorkerTasks()
)什么螺栓有什么任务(getComponentTasks()
)3) 您自己的分区逻辑,如前面所述,它利用上面(2)中的信息为每个bolt的出站元组指定特定的目标任务。