1

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

因此,如果有两个工作进程,每个进程都有 1 个 Kafka-Spout 和 2 个 elastic-search-bolts,则 local-or-shuffle 分组会给我以下信息:

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-server 进一步拆分,因为所有这些文档的目标分片都是相同的(我计划将字段destination_shard添加到文档以进行字段级分组,并且将计算destination_shard作为Murmurm3.hash(ID)%numShards )。

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

谢谢您的帮助 !

4

1 回答 1

2

不和是。

没有分组值可以满足您的要求,但您可以使用以下方法自己实现分组:

1)定向流,在其中你指定bolt实例的任务id来处理元组(而不是让Storm解决)

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

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

于 2016-04-02T15:01:36.763 回答