为喷嘴/螺栓创建多少个实例。任务在具有零个或多个其他任务的线程上运行,用于相同的喷口/螺栓。在拓扑的整个生命周期中,喷口/螺栓的任务数始终相同,但喷口/螺栓的执行器(螺纹)数量可能会随时间而变化。这允许拓扑扩展到更多或更少的资源,而无需重新部署拓扑或违反Storm的约束(例如保证相同值转到同一任务的字段分组)
我的问题是:
答案 0 :(得分:1)
Config#TOPOLOGY_TASKS -> How many tasks to create per component.
任务执行实际的数据处理,并在其父执行程序的执行线程中运行。您在代码中实现的每个spout或bolt都会在整个群集中执行任意数量的任务。
在拓扑的整个生命周期中,组件的任务数始终相同,但组件的执行程序(线程)数量可能会随时间而变化。这意味着以下条件成立:#threads <= #tasks
。
默认情况下,任务数设置为与执行程序数相同,即Storm将为每个线程运行一个任务(这通常是您想要的)。
还要注意:
拓扑开始后,可以更改执行程序线程的数量。
拓扑的任务数量是静态的。
答案 1 :(得分:0)
我认为https://stackoverflow.com/a/47714449/8845188是一个很好的答案,但我会尝试将其改为示例:
当您提交拓扑时,组件的任务数量(例如,喷口或螺栓)将一目了然,而执行器的数量可以在不重新部署拓扑的情况下进行更改。执行程序的数量始终小于或等于组件的任务数。
你通常没有理由选择跑步,例如1个执行程序中的2个任务,但如果您当前负载较低但后期预计负载较高,则可以选择提交具有大量任务但执行程序数较少的拓扑。当然,您只需提交具有预期所需数量的执行程序的拓扑,但由于上下文切换和/或潜在的资源争用,在您只需要少量线程时使用多个线程效率低下。
例如,假设您提交拓扑结构,以便spout有4个任务和4个执行程序(每个执行一个)。当您的负载增加时,您无法进一步扩展,因为4是您可以拥有的最大执行程序数。您现在必须重新部署拓扑以便随负载进行扩展。
让我们说你提交你的拓扑结构,所以spout有32个任务和4个执行器(每个8个)。当负载增加时,即使您只使用4,也可以将执行程序的数量增加到32个。您可以在不重新部署拓扑的情况下进行扩展。
让我们说你的拓扑结构有一个喷口A和一个螺栓B.假设螺栓B做了一些重量级工作(例如,每个执行器每秒可以做10个元组),而喷口是轻量级的(例如,每个执行者每秒可以做1000个元组)。我们假设您的负载最初是每秒20条消息进入拓扑结构,但您希望它会增长。
在这种情况下,您可以配置1个执行器和1个任务,因为它可能在大多数时间处于空闲状态。同时,您希望配置具有大量任务的螺栓,以便您可以扩展它的执行程序数量,并至少启动2-3个执行程序。
答案 2 :(得分:0)
还有另一个原因,即代替执行者的任务更有意义。 让我们假设您在单个执行程序(线程)上运行相同螺栓的2个任务。让我们假设您正在调用相对较长的运行(可能是1秒)数据库子例程,并且需要在继续进行之前得到结果。
案例1 - 您的数据库调用将在执行程序线程上运行,它会暂停一段时间,并且您无法通过运行2个任务获得任何收益。 情况2 - 您重构数据库调用代码以生成新线程并执行。在这种情况下,您的主执行程序线程将不会挂起,并且当新生成的线程将从数据库获取数据时,它将能够开始处理第二个bolt任务。
除非您在组件中引入自己的并行性,否则我没有看到性能提升,除了其他答案中提到的维护原因之外没有理由运行多个任务。