apachestorm:为什么以及如何选择每个执行器的任务数?

rqqzpn5f  于 2021-06-24  发布在  Storm
关注(0)|答案(3)|浏览(318)

根据官方文件:
要为喷口/螺栓创建多少个示例。一个任务在一个线程上运行,同一个喷口/螺栓上有零个或多个其他任务。在拓扑的整个生命周期中,喷口/螺栓的任务数始终相同,但喷口/螺栓的执行器(线程)数可能会随时间而变化。这使得拓扑可以扩展到更多或更少的资源,而无需重新部署拓扑或违反storm的约束(例如,字段分组保证相同的值分配给相同的任务)
我的问题是:
在什么情况下,我会选择在一个执行器中运行多个任务?
如果我在一个执行器中使用了多个任务,那么我会选择每个执行器的不同任务数(例如每个执行器有2个任务,但每个执行器只有1个任务)的原因是什么?

z9zf31ra

z9zf31ra1#

我想https://stackoverflow.com/a/47714449/8845188 这是一个很好的答案,但我会尝试将其改写为示例:
当您提交拓扑时,组件的任务数(例如喷口或螺栓)是固定不变的,而执行器的数量可以在不重新部署拓扑的情况下更改。执行器的数量始终小于或等于组件的任务数量。

问题1

通常情况下,您没有理由选择在1个执行器中运行2个任务,但如果您当前的负载较低,但预期稍后的负载较高,则可以选择提交任务数较多但执行器数较少的拓扑。当然,您可以只提交包含您期望的任意多个执行器的拓扑,但是由于上下文切换和/或潜在的资源争用,在只需要少数执行器的情况下使用多个线程是低效的。
例如,假设您提交了拓扑结构,这样saut就有4个任务和4个执行器(每个执行器一个)。当您的负载增加时,您无法进一步扩展,因为4是您可以拥有的最大执行者数。现在必须重新部署拓扑才能随负载扩展。
假设您提交了拓扑结构,这样saut就有32个任务和4个执行器(每个执行器8个)。当负载增加时,可以将执行器的数量增加到32个,即使一开始只有4个。您可以在不重新部署拓扑的情况下进行扩展。

问题2

假设你的拓扑有一个喷口a和一个螺栓b。假设bolt b做了一些重量级的工作(例如,每个executor每秒可以做10个元组),而spout是轻量级的(例如,每个executor每秒可以做1000个元组)。假设您的负载最初是每秒20条消息进入拓扑,但您预计会增加。
在这种情况下,您可以使用1个执行器和1个任务来配置您的喷口是有意义的,因为它可能大部分时间都是空闲的。同时,您希望为bolt配置大量的任务,以便可以缩放bolt的执行器数量,并且至少要启动2-3个执行器。

brgchamk

brgchamk2#

另一个原因是让任务代替执行者更有意义。假设在一个执行器(线程)上运行同一个螺栓的两个任务。让我们假设您正在调用一个运行时间相对较长(可能是1秒)的数据库子例程,并且在继续之前需要结果。
情况1-数据库调用将在executor线程上运行,它将暂停一段时间,并且运行2个任务不会获得任何收益。案例2—重构数据库调用代码以生成新线程并执行。在这种情况下,主执行器线程将不会挂起,它将能够开始处理第二个bolt任务,而新生成的线程将从数据库获取数据。
除非您在组件中引入自己的并行性,否则我看不到性能提升,也没有理由运行多个任务,除了其他答案中提到的维护原因之外。

vsmadaxz

vsmadaxz3#

Config#TOPOLOGY_TASKS -> How many tasks to create per component.

任务执行实际的数据处理,并在其父执行器的执行线程中运行。在代码中实现的每个分支或插销在集群中执行同样多的任务。
在拓扑的整个生命周期中,组件的任务数始终相同,但组件的执行器(线程)数可能会随时间而变化。这意味着以下条件成立: #threads <= #tasks .
默认情况下,任务数设置为与执行器数相同,即storm将为每个线程运行一个任务(这通常是您想要的)。
还要注意:
拓扑启动后,可以更改执行器线程的数量。
拓扑的任务数是静态的。

相关问题