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

Is there a way to apply multiple groupings in storm?

我想将 "Fields grouping" 和 "Local or shuffle grouping" 应用于我的拓扑结构,这样每个 spout 仅将数据发送到本地螺栓,但也使用我文档中的字段来决定它的本地螺栓应该去。

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

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-Spout

ES = 弹性搜索

我想这样做,以便我可以在 ES-bolt 中将单个分片的所有文档分组在一起。这样,ES-bolt 发送的批次将不会被 ES-server 进一步拆分,因为所有这些文档的目标分片都是相同的(我计划添加字段 destination_shard 到文档进行字段级分组,destination_shard 将计算为 Murmurm3.hash(ID)%numShards).

然后我不想要任何进程间通信,因此需要 "local or shuffle grouping"

感谢您的帮助!

否和是。

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

1) 定向流,您在其中指定 bolt 实例的任务 ID 来处理元组(而不是让 Storm 弄清楚)

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

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