我正在尝试通过关注伟大的文章“Understanding the parallelism of a Storm topology”
来学习Twitter风暴然而,我对“任务”的概念感到有点困惑。任务是组件的运行实例(spout还是bolt)?具有多个任务的执行程序实际上是说执行程序多次执行相同的组件,我是否正确?
此外,在一般的并行意义上,Storm会为一个spout或bolt生成一个专用线程(执行器),但是由具有多个任务的执行者(线程)对并行性做出了什么贡献?我认为在一个线程中有多个任务,因为一个线程按顺序执行,只会使该线程成为一种“缓存”资源,从而避免为下一个任务运行产生新线程。我对么?
我可以在花更多时间调查之后自己清除这些困惑,但是你知道,我们都喜欢stackoverflow; - )
提前致谢。
答案 0 :(得分:69)
免责声明:我在上述问题中提到了您the article。
然而,我对“任务”的概念感到有点困惑。任务是组件的运行实例(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实际上会产生a few more threads behind the scenes。例如,每个执行程序都有自己的“发送线程”,负责处理传出的元组。例如,还存在“系统级”后台线程。与“你的”线程一起运行的acup元组。 IIRC除了“你的”线程之外,Storm UI还会计算那些acking线程。