要在三叉戟风暴中应用某些函数流,我们将新创建的实例传递给each
方法,该方法在流上调用,如下所示:
stream.each(inputFields, new SomeFunc(), outputFields)
其中SomeFunc
是BaseFunc的后代。
假设我想在SomeFunc
中有一些状态变量:
class SomeFunc extends BaseFunction {
var someState: String = _
override def execute(tuple: TridentTuple, collector: TridentCollector) = ???
}
如果我将并行度提示设置为SomeFunc组件的某个大于1的值,那么storm会创建SomeFunc
的多个实例吗?在SomeFunc中访问/更新someState是一个线程安全的操作吗?如果不是将SomeClass定义为类而是将其定义为对象,那么会改变吗?
修改 好的,在用户@Shaw的帮助下,他回答了我的问题,我了解到风暴会为每个执行者创建一个风暴组件实例(风暴/螺栓/功能/聚合器等)。问题是它是如何做到这一点的?我想知道这种行为的机制
答案 0 :(得分:1)
我不知道三叉戟究竟是如何工作的,但如果你定义了并行性提示,请参阅Storm中的> 1 为该组件创建多个执行程序,这些是由工作进程生成的线程。
执行者将创建一个X(任务数量,默认为1)"实例" SomeFunc和不共享它们之间的变量someState 。由于风暴工作,someState 是threadSafe 因为它们在自己的线程中按顺序执行元组"因为他们到达组件。
我几乎可以肯定Trident是相同的,因为它只是对Storm的微批量抽象。
当然你已经阅读过了,但如果没有,我强烈建议你阅读这篇关于Storm中并行性的great article。