在风暴或三叉戟中的状态下的螺栓/功能

时间:2014-09-19 23:55:42

标签: scala apache-storm trident

要在三叉戟风暴中应用某些函数流,我们将新创建的实例传递给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的帮助下,他回答了我的问题,我了解到风暴会为每个执行者创建一个风暴组件实例(风暴/螺栓/功能/聚合器等)。问题是它是如何做到这一点的?我想知道这种行为的机制

1 个答案:

答案 0 :(得分:1)

我不知道三叉戟究竟是如何工作的,但如果你定义了并行性提示,请参阅Storm中的> 1 为该组件创建多个执行程序,这些是由工作进程生成的线程。

执行者将创建一个X(任务数量,默认为1)"实例" SomeFunc和不共享它们之间的变量some​​State 。由于风暴工作,someState 是threadSafe 因为它们在自己的线程中按顺序执行元组"因为他们到达组件。

我几乎可以肯定Trident是相同的,因为它只是对Storm的微批量抽象。

当然你已经阅读过了,但如果没有,我强烈建议你阅读这篇关于Storm中并行性的great article