我想在我的拓扑中应用“字段分组”以及“本地或随机分组”,以便每个喷口仅将数据发送到本地螺栓,但也使用我的文档中的字段来决定应该使用哪些局部螺栓到。
因此,如果有两个工作进程,每个进程有1个Kafka-Spout和2个弹性搜索螺栓,则本地或随机分组给出了以下内容:
Each KS ---> Two local ES-Bolts
fields-grouping给出了以下内容:
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-Spout
ES =弹性搜索
我想这样做,以便我可以在ES-bolt中将一个分片的所有文档组合在一起。这样,ES-bolt发送的批处理不会被ES服务器进一步拆分,因为所有这些文档的目标分片都是相同的(我计划将字段 destination_shard 添加到字段的文档中 - level grouping和destination_shard将计算为 Murmurm3.hash(ID)%numShards )。
然后我不希望任何进程间通信,因此需要“本地或随机分组”
感谢您的帮助!
答案 0 :(得分:2)
不,是的。
没有分组值能够满足您的需求,但您可以使用以下方式实现分组:
1)定向流,在其中指定螺栓实例的任务ID来处理元组(而不是让Storm计算出来)
2)拓扑上下文在启动时传递给每个螺栓和喷口。该对象可以告诉您哪些任务正在当前工作程序上运行(使用getThisWorkerTasks()
)以及哪些任务具有哪些任务(getComponentTasks()
)
3)您自己的分区逻辑,如上所述,它利用上面(2)中的信息为每个螺栓的出站元组指定特定的目标任务。