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

时间:2016-04-02 01:33:53

标签: apache-storm elasticsearch-hadoop

我想在我的拓扑中应用“字段分组”以及“本地或随机分组”,以便每个喷口仅将数据发送到本地螺栓,但也使用我的文档中的字段来决定应该使用哪些局部螺栓到。

因此,如果有两个工作进程,每个进程有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 )。

然后我不希望任何进程间通信,因此需要“本地或随机分组”

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

不,是的。

没有分组值能够满足您的需求,但您可以使用以下方式实现分组:

1)定向流,在其中指定螺栓实例的任务ID来处理元组(而不是让Storm计算出来)

2)拓扑上下文在启动时传递给每个螺栓和喷口。该对象可以告诉您哪些任务正在当前工作程序上运行(使用getThisWorkerTasks())以及哪些任务具有哪些任务(getComponentTasks()

3)您自己的分区逻辑,如上所述,它利用上面(2)中的信息为每个螺栓的出站元组指定特定的目标任务。