Apache storm 在Apache Storm拓扑开始时只执行一次方法

Apache storm 在Apache Storm拓扑开始时只执行一次方法,apache-storm,Apache Storm,如果我有一个简单的ApacheStorm拓扑,在两个单独的节点上运行一个喷口(设置为并行度2)。在元组处理开始之前,如何编写一个在拓扑开始时只运行一次的方法 单例/静态类或同步方法的任何实现都无法单独工作,因为这两个实例运行在不同的节点上 也许有一些Storm方法可以用来决定我是否是第一个被实例化的喷口,然后才运行?我尝试使用getHistAskid()和getThisWorkerTasks()方法,但没有成功 注意:2的并行性是为了保持简单。一个解决方案应该适用于任意数量的节点/工作节点。编辑

如果我有一个简单的ApacheStorm拓扑,在两个单独的节点上运行一个喷口(设置为并行度2)。在元组处理开始之前,如何编写一个在拓扑开始时只运行一次的方法

单例/静态类或同步方法的任何实现都无法单独工作,因为这两个实例运行在不同的节点上

也许有一些Storm方法可以用来决定我是否是第一个被实例化的喷口,然后才运行?我尝试使用getHistAskid()和getThisWorkerTasks()方法,但没有成功


注意:2的并行性是为了保持简单。一个解决方案应该适用于任意数量的节点/工作节点。

编辑:考虑一个更简单的解决方案。如果有帮助,我会在下面留下原始答案

您可以使用
TopologyContext.getHistaskindex
来执行此操作。如果您使您的spout
打开
方法仅在
TopologyContext.getHistasKindex==0时运行代码,那么在发出任何元组之前,您的代码将只运行一次

如果运行此代码的工作进程崩溃,则当任务索引为0的喷口实例重新启动时,代码将再次运行。为了解决这一问题,您可以使用Zookeeper来存储重新启动时应结转的状态,例如,在仅运行一次代码后,在Zookeeper中放置一个标志,并在运行代码前打开喷口
检查标志是否未设置

您可以使用
TopologyContext.getStormId
获取一个常量唯一字符串来标识拓扑,这样您就可以知道该标志是由该拓扑还是由以前的部署设置的

原始答复:

在部署拓扑时只运行一次代码的最简单方法是在提交拓扑时调用代码。使用
TopologyBuilder
连接拓扑时,只能调用一次代码。这将只运行一次。缺点是它将在您调用的机器上运行

如果您出于某种原因不能这样做,或者需要从一个工作节点运行代码,则Storm中没有任何内置内容允许您这样做。没有这样一个机制的原因是它需要工作JVM之间的额外协调,我认为没有人需要这样的机制

对你来说,最好的选择可能是让动物园管理员/馆长进行协调(参见)。这应该允许您只让集群中的一个worker运行您的代码。你必须考虑如果选择运行代码崩溃的人会发生什么。< /P>
Storm已经使用Zookeeper进行协调,所以您可以直接连接到该集群。

这对我来说很有效!你的编辑方法就是我采用的方法。