使风暴喷口等待螺栓准备好
Posted
技术标签:
【中文标题】使风暴喷口等待螺栓准备好【英文标题】:Making storm spouts wait for bolts to be ready 【发布时间】:2014-05-13 19:08:57 【问题描述】:现在 Storm Spouts 有一个 open 方法来配置它们,而 Bolts 有一个 prepare 方法。有什么办法可以让所有 Spout 实例等待 Bolts 上的所有准备方法完成?
我有一个案例,我想动态地将一些配置信息传递给螺栓(因为这个配置信息一直在变化)。我在某些地方读到我们应该使用 Zookeeper 或内存中的键值存储(如 redis)来执行此操作。不过我担心的是,如果 Bolts 还没有准备好处理来自 Spout 的数据,并且 Spout 开始发出元组,会发生什么?有没有办法让 Spout 等待 Bolts 的更新,说他们准备好了?
【问题讨论】:
一种选择是在spout的nextTuple()方法中使用storm的Utils类,Utils.sleep(ms)只在第一次使用(不是针对每个元组)。 【参考方案1】:我为此找到了一个稍微优雅的解决方案(我认为)。问题是某些螺栓需要配置信息才能处理传入的元组。我发现了 Storm 重播元组的能力,所以现在我的 bolts 监听来自一个 spout 的更新,以及来自另一个 spout 的元组。只要我没有收到更新,我就会一直使元组失败并让 spout 在可配置的时间后重播它们。
【讨论】:
嗨 Vivek,您的意思是可以使用所谓的ConfigSpout
代替在准备方法中从 Redis 读取的配置吗?我只是发现如果 SecondBolt 没有在 prepare 方法中完成它的工作,那么从 FirstSpout 或 FirstBolt 发出的任何信号都会导致 java.lang.NullPointerException
。
嗯,这很奇怪。如果prepare
还没有完成,甚至不应该在你的螺栓上调用execute
。 stacktrace 是否指向您 bolt 的 execute
方法中的代码?
谢谢维韦克。实际上,prepare 方法没有任何内容。我只是发现我忘了为第一个螺栓声明字段,这真是一个愚蠢的错误,【参考方案2】:
是的,您可以使用 Redis 来存储您的配置,然后从 prepare
方法中读取它。
prepare
方法由工作进程调用,工作进程在完成后开始处理元组。实际上,我认为在工作进程的所有组件都准备好之前不会发出元组。 http://nathanmarz.github.io/storm/doc-0.8.1/index.html
最后,您可以有一个额外的 spout 来查找配置更改。然后,如果有更新的配置可用,它会通过命名流发送到您的螺栓。
【讨论】:
您好,谢谢您的回复!我决定搁置这个问题,继续做其他事情。不幸的是,Storm 在启动 spout 之前不会等待所有组件都准备好,所以我想 redis 将是解决此类问题的最佳方法。【参考方案3】:您不必担心这一点。 Storm 框架在 Spout 之前加载 Bolt。 Storm 以相反的顺序加载螺栓。靠近拓扑末端的螺栓在拓扑中间的螺栓之前加载,最后,Spout 被加载。
【讨论】:
嗨 Akhil,我无法验证加载组件的顺序是否正确,但无论下游螺栓是否已执行,您的 spout 肯定会开始推送数据prepare()
方法与否。以上是关于使风暴喷口等待螺栓准备好的主要内容,如果未能解决你的问题,请参考以下文章
当我将拓扑提交给风暴时,我从“ lein”中得到一个错误]]