使用Storm Spouts,何时调用declareOutputFields()?

时间:2014-02-10 22:16:37

标签: lifecycle apache-storm

我想知道何时调用Storm Spout上的各种方法。

我看了ISpout javadoc,这给了我以下心理模型:

"instantiated" -- open(...) -----> "activated"
"activated"    -- deactivate() --> "deactivated"
"deactivated"  -- activate() ----> "activated"
"activated"    -- close() -------> "shutdown"
"deactivated"  -- close() -------> "shutdown"

但我不确定何时调用IComponent.declareOutputFields(...)open(...)之前或之后?何时需要声明输出流和字段?在declareOutputFields(...)内?或者可以保留对OutputFieldsDeclarer的引用并在以后定义它们?如果是这样,它可以在一个单独的线程上吗?

我发现了这个相关问题(Testing Storm Bolts and Spouts),但答案似乎没有指出任何设计原则或规范。

1 个答案:

答案 0 :(得分:8)

当客户端代码在TopologyBuilder实例上调用IComponent.declareOutputFields(...)时,在客户端计算机上调用方法createTopology()。请查看TopologyBuilder.java中在Spout或Bolt组件上调用此方法的第226行。

回调方法IComponent.declareOutputFields(...)是拓扑生命周期的一部分,而不是Spout或Bolt生命周期的一部分。要回答您的问题,请在open()方法之前调用此方法。

输出字段应在declareOutputFields()方法中声明,以便Storm序列化Spout / Bolt对象,包括配置和输出字段。然后将Spout / Bolt的序列化实例提交给Storm集群,之后调用Spout / Bolt的其他生命周期方法(activate()open()等)。