我正试图通过阅读一篇伟大的文章“理解风暴拓扑的并行性”来学习twitter风暴
然而,我有点困惑的概念“任务”。任务是组件(喷口或螺栓)的运行示例吗?一个有多个任务的执行者实际上是说同一个组件被执行者执行了多次,对吗?
此外,在一般的并行性意义上,storm将为一个喷口或螺栓生成一个专用线程(executor),但是有多个任务的executor(thread)对并行性有什么贡献呢?我认为在一个线程中有多个任务,因为一个线程按顺序执行,只会使线程成为一种“缓存”资源,从而避免为下一个任务运行生成新线程。我说的对吗?
在花更多的时间调查之后,我可能会自己解决这些困惑,但是你知道,我们都喜欢;-)
提前谢谢。
1条答案
按热度按时间nuypyhwy1#
免责声明:我写了你在上面的问题中提到的文章。
然而,我有点困惑的概念“任务”。任务是组件(喷口或螺栓)的运行示例吗?一个有多个任务的执行者实际上是说同一个组件被执行者执行了多次,对吗?
是的,是的。
此外,在一般的并行性意义上,storm将为一个喷口或螺栓生成一个专用线程(executor),但是有多个任务的executor(thread)对并行性有什么贡献呢?
每个执行器运行多个任务并不能提高并行度——执行器总是有一个线程用于其所有任务,这意味着任务在执行器上串行运行。
正如我在文章中所写,请注意:
拓扑启动后,可以更改执行器线程的数量(请参阅
storm rebalance
命令)。拓扑的任务数是静态的。
从定义上讲,这就是
#executors <= #tasks
.因此,每个执行器线程有2个以上的任务的一个原因是,可以灵活地通过
storm rebalance
命令而不使拓扑脱机。例如,假设你一开始有一个由15台机器组成的风暴集群,但你已经知道下周还会有10台机器加入。在这里,您可以选择以预期的并行级别运行拓扑,即在15个初始框上已经有25台机器(当然比25个框慢)。一旦额外的10个盒子被整合,你就可以storm rebalance
拓扑结构充分利用了所有的25个盒子,没有任何停机时间。每个执行器运行2+个任务的另一个原因是(主要是功能)测试。例如,如果您的dev机器或ci服务器的功能只足以运行2个执行器以及机器上运行的所有其他东西,那么您仍然可以运行30个任务(这里:每个执行器15个),以查看诸如自定义风暴分组之类的代码是否按预期工作。
实际上,我们通常为每个执行者运行一个任务。
ps:注意storm实际上会在幕后产生更多的线程。例如,每个执行器都有自己的“发送线程”,负责处理传出元组。还有一些“系统级”后台线程,例如,与“您的”线程一起运行的acking元组。iirc风暴用户界面除了计算“你的”线程外,还计算那些acking线程。