用户工具


  • localOrShuffleGrouping :发给同一个worker内部的bolt

    不建议使用,如果有10个task的并发,但是碰巧有一个task在该worker内部,则所有数据都会发到本地的task,其他9个task则得不到任何数据)

  • 每个bolt类只会被实例化excutor个数次,每次task的被调用时,只是调用bolt类实例中的execute函数

    所以每个bolt类中的变量,在task的每次调用过程中可以被共享

  • 对于bolt中的静态成员可以在worker级别别共享(且静态对象无需支持序列化)
  • 当collect.emit(object)发送一个对象时,不要立即去更改object对象
    • 因为emit()发送过程是异步的,真正发出去的可能(取决于是emit先执行,还是你修改的代码先执行)是你改之后的值

  • 每个bolt都可以有构造函数和prepare函数
    • 构造函数是在jar分发之前就会被执行的
    • prepare函数是jar分发到本地机器后,在本地执行的

如果要做数据共享,最好的方式是,通过构造函数把参数传入每一个bolt,然后在每个bolt内部的prepare函数中创建共享对象(尽量让对象在本地生成,因为有些类可能很大,或者无法序列化不方便在网络上传输) 有空时画一个完整的图

  • bolt类,bolt实例,task 之间是什么关系
  • 每次数据进来时,是如何调用execute函数的
  • bolt变量共享方式,级别