【问题标题】:With Storm Spouts, when is declareOutputFields( ) called?使用 Storm Spouts,什么时候调用 declareOutputFields()?
【发布时间】:2014-02-10 22:16:37
【问题描述】:

我想知道 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),但答案似乎没有指向任何设计原则或规范。

【问题讨论】:

    标签: lifecycle apache-storm


    【解决方案1】:

    当客户端代码在 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() 等)。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 2013-09-14
      • 2020-10-21
      • 2019-12-25
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      相关资源
      最近更新 更多