有没有办法在风暴中应用多个分组?
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) 中的信息为每个螺栓的出站元组指定特定的目标任务。
我想将 "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) 中的信息为每个螺栓的出站元组指定特定的目标任务。