免责声明:我写了您在上面的问题中引用的文章。
但是,我对“任务”的概念有些困惑。任务是组件(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 还会计算那些正在响应的线程。