Storm 是否支持动态拓扑?我想要的功能是在 Storm 拓扑运行时根据用户要求动态更改拓扑。例如,当用户想知道流的前 10 个单词时,我使用前 10 个螺栓来处理它,当用户想知道其他内容时,我使用另一个螺栓来处理流并“拔掉”前 10 个螺栓。
我知道这可以通过对流进行分区或复制流并始终运行每个功能并仅演示我们想要的数据来完成,或者我们可以关闭流并更新另一个拓扑,但是是否有“热插件”方式要做到这一点?
Storm 是否支持动态拓扑?我想要的功能是在 Storm 拓扑运行时根据用户要求动态更改拓扑。例如,当用户想知道流的前 10 个单词时,我使用前 10 个螺栓来处理它,当用户想知道其他内容时,我使用另一个螺栓来处理流并“拔掉”前 10 个螺栓。
我知道这可以通过对流进行分区或复制流并始终运行每个功能并仅演示我们想要的数据来完成,或者我们可以关闭流并更新另一个拓扑,但是是否有“热插件”方式要做到这一点?
您不能动态地更改 Storm 拓扑的结构,即修改 spout 和 bolts 布线。Storm 拓扑的布线始终是静态的。
但是,您可以用您已经描述的其他方式实现所需的功能。恕我直言,最好、最合乎逻辑的方法是运行多个拓扑——以防数据处理差异很大。但是如果这两种情况的大部分处理是相似的,只需复制源流并在相同拓扑的不同分支中处理数据即可。
没有内置的方法可以做到这一点(将一个螺栓换成另一个),但您可以做的是编写一个螺栓,根据它接收到的输入执行任意代码。只要您的输入和输出在storm中具有相同的结构(发出相同的元组),理论上您可以在运行时在bolt中执行您想要的任何内容。如果您在 Clojure 中构建 Bolt,这将特别容易,但在您可以与 Storm 一起使用的几乎所有语言中,这都是可能的。
但是,这可能没有多大意义,因为您想要进行的大多数计算都涉及多个螺栓,并有助于传递不同结构的元组。正如 schiavuzzi 在他们的回答中已经说过的那样,如果您想对流进行多个独立的计算,那么运行多个拓扑可能会更好。
它于 2015 年 6 月 3 日在 STORM-561 上添加:
对于热部署,eBay 提供了一个新的流媒体平台。
喷射流: https ://github.com/pulsarIO/jetstream 。
它有一个内置的配置管理工具,你的配置位于 mongodb 中。当用户修改 config bean 时,该工具会将通知发布到 zookeeper,相应的 JetStream 应用程序将收到通知并动态更改配置