50

我正在尝试通过阅读精彩文章“了解 Storm 拓扑的并行性”来学习 twitter Storm

但是,我对“任务”的概念有些困惑。任务是组件(spout 或 bolt)的运行实例吗?具有多个任务的执行者实际上是说执行者多次执行相同的组件,对吗?

此外,在一般并行性的意义上,Storm 将为 spout 或 bolt 生成一个专用线程(执行器),但是具有多个任务的执行器(线程)对并行性有何贡献?我认为在一个线程中有多个任务,因为一个线程顺序执行,只会使线程成为一种“缓存”资源,从而避免为下一个任务运行产生新线程。我对么?

在花更多时间调查之后,我可能会自己消除这些困惑,但你知道,我们都喜欢 stackoverflow ;-)

提前致谢。

4

1 回答 1

78

免责声明:我写了您在上面的问题中引用的文章。

但是,我对“任务”的概念有些困惑。任务是组件(spout 或 bolt)的运行实例吗?具有多个任务的执行者实际上是说执行者多次执行相同的组件,对吗?

是的,是的。

此外,在一般并行性的意义上,Storm 将为 spout 或 bolt 生成一个专用线程(执行器),但是具有多个任务的执行器(线程)对并行性有何贡献?

每个执行器运行多个任务不会提高并行度——执行器总是有一个线程用于其所有任务,这意味着任务在执行器上串行运行。

正如我在文章中所写,请注意:

  • 启动拓扑后,可以更改执行器线程的数量(请参阅storm rebalance命令)。
  • 拓扑的任务数量是静态的。

根据定义,有 的不变量#executors <= #tasks

因此,每个执行程序线程有 2 个以上任务的一个原因是让您可以灵活地storm rebalance在将来通过命令扩展/扩展拓扑,而无需使拓扑脱机。例如,假设您开始使用 15 台机器的 Storm 集群,但已经知道下周将添加另外 10 台机器。在这里,您可以选择在 15 个初始框(当然比 25 个框慢)上以 25 台机器的预期并行度运行拓扑。一旦集成了额外的 10 个盒子,您就可以storm rebalance在拓扑结构中充分利用所有 25 个盒子,而无需任何停机时间。

每个执行程序运行 2 个以上任务的另一个原因是(主要是功能性)测试。例如,如果您的开发机器或 CI 服务器的功能仅足以运行 2 个执行器以及机器上运行的所有其他东西,您仍然可以运行 30 个任务(这里:每个执行器 15 个)以查看代码是否如您的自定义 Storm 分组按预期工作。

在实践中,我们通常每个执行者运行 1 个任务。

PS:请注意,Storm 实际上会在幕后产生更多线程。例如,每个执行程序都有自己的“发送线程”,负责处理传出的元组。还有“系统级”后台线程,例如,与“您的”线程一起运行的确认元组。IIRC 除了“你的”线程之外​​,Storm UI 还会计算那些正在响应的线程。

于 2013-07-03T17:31:49.743 回答