Storm的参数构造问题记录

原创
2016/09/27 14:55
阅读数 190

Storm正常的参数构造应该放在prepare方法中,但是如果你放在了bolt的构造函数的中,则会出现问题,参数得不到正常的初始化,原因如下:

Bolt是Storm中的基础运行单位,当接收到一条数据时可以不立刻对其进行处理,可以先保存后处理。其生命周期如下:

  1. 创建提交Topology时创建IBolt实例并进行序列化操作(见createTopology());
  2. 将序列化的Bolt组件发送给集群中的主节点;
  3. 主节点启动工作进程,并在进程中反序列化Bolt组件;
  4. 在开始执行任务之前,先调用Bolt的prepare()回调方法进行初始化,然后再具体处理接收的数据。 IBolt的具体代码如下:
public interface IBolt extends Serializable{
    void prepare(Map stormConf, TopologyContext context, OutputCollector collector);
    void execute(Tuple input);
    void cleanup();
}

在实现Bolt的过程中,用户可以编写其构造函数,然而构造函数并不会被实际调用,因为在提交Topology时,系统会调用Topology的构造函数,并将产生的对象序列化成字节数组。每一个节点上的Bolt都是通过反序列化的方式得到的,这可能导致某些成员没有被正确的初始化,因此用户应该将复杂对象的初始化放在prepare()回调方法中。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部