【问题标题】:Is there a way to apply multiple groupings in storm?有没有办法在风暴中应用多个分组?
【发布时间】:2016-04-02 01:33:53
【问题描述】:

我想对我的拓扑应用“字段分组”以及“本地或随机分组”,这样每个 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)。

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

感谢您的帮助!

【问题讨论】:

    标签: apache-storm elasticsearch-hadoop


    【解决方案1】:

    不是和是。

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

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

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

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

    【讨论】:

    • 这种方法的最大问题是需要与定向流一起使用的 emitDirect() 方法。我正在使用 KafkaSpout 并且无法控制其发出方法。另外,你觉得上面的逻辑用 Flux 的配​​置可以很容易的表达出来吗?
    • 问题出在 KafkaSpout 的使用上,正如您所看到的那样,它非常不灵活。尝试将元组从 KafkaSpout 发送到您自己的 Bolt,并将上述直接流逻辑放入该 Bolt。
    猜你喜欢
    • 2020-02-26
    • 1970-01-01
    • 2018-02-02
    • 2016-01-08
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多