2014-02-10 56 views
2

我想知道何時Storm Spout上的各種方法被調用。有了Storm Spouts,何時調用declareOutputFields()?

我已經看了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),但答案似乎沒有指向任何設計原則或規範。

回答

8

當客戶端代碼在TopologyBuilder實例上調用createTopology()時,將在客戶端計算機上調用方法IComponent.declareOutputFields(...)。請查看TopologyBuilder.java中的第226行,在Spout或Bolt組件上調用此方法。

回調方法IComponent.declareOutputFields(...)是拓撲生命週期的一部分,而不是Spout或Bolt生命週期的一部分。要回答你的問題,這個方法在open()方法之前被調用。

輸出字段應該在declareOutputFields()方法中聲明,以便Storm序列化Spout/Bolt對象,包括配置和輸出字段。然後將Spout/Bolt的序列化實例提交給Storm集羣,然後調用Spout/Bolt的其他生命週期方法(activate(),open()等)。