Apache风暴:为什么以及如何选择每个执行者的任务数量?

时间:2017-12-08 00:59:39

标签: apache-storm apache-storm-topology

根据official documentation

  

为喷嘴/螺栓创建多少个实例。任务在具有零个或多个其他任务的线程上运行,用于相同的喷口/螺栓。在拓扑的整个生命周期中,喷口/螺栓的任务数始终相同,但喷口/螺栓的执行器(螺纹)数量可能会随时间而变化。这允许拓扑扩展到更多或更少的资源,而无需重新部署拓扑或违反Storm的约束(例如保证相同值转到同一任务的字段分组)

我的问题是:

  1. 在什么情况下我会选择在一个执行程序中运行多个任务?
  2. 如果我在一个执行器中使用多个任务,那么我可能会在我的喷口和螺栓之间为每个执行器选择不同数量的任务(例如每个螺栓执行器有2个任务,但每个喷嘴执行器只有1个任务)?

3 个答案:

答案 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

你通常没有理由选择跑步,例如1个执行程序中的2个任务,但如果您当前负载较低但后期预计负载较高,则可以选择提交具有大量任务但执行程序数较少的拓扑。当然,您只需提交具有预期所需数量的执行程序的拓扑,但由于上下文切换和/或潜在的资源争用,在您只需要少量线程时使用多个线程效率低下。

例如,假设您提交拓扑结构,以便spout有4个任务和4个执行程序(每个执行一个)。当您的负载增加时,您无法进一步扩展,因为4是您可以拥有的最大执行程序数。您现在必须重新部署拓扑以便随负载进行扩展。

让我们说你提交你的拓扑结构,所以spout有32个任务和4个执行器(每个8个)。当负载增加时,即使您只使用4,也可以将执行程序的数量增加到32个。您可以在不重新部署拓扑的情况下进行扩展。

问题2

让我们说你的拓扑结构有一个喷口A和一个螺栓B.假设螺栓B做了一些重量级工作(例如,每个执行器每秒可以做10个元组),而喷口是轻量级的(例如,每个执行者每秒可以做1000个元组)。我们假设您的负载最初是每秒20条消息进入拓扑结构,但您希望它会增长。

在这种情况下,您可以配置1个执行器和1个任务,因为它可能在大多数时间处于空闲状态。同时,您希望配置具有大量任务的螺栓,以便您可以扩展它的执行程序数量,并至少启动2-3个执行程序。

答案 2 :(得分:0)

还有另一个原因,即代替执行者的任务更有意义。 让我们假设您在单个执行程序(线程)上运行相同螺栓的2个任务。让我们假设您正在调用相对较长的运行(可能是1秒)数据库子例程,并且需要在继续进行之前得到结果。

案例1 - 您的数据库调用将在执行程序线程上运行,它会暂停一段时间,并且您无法通过运行2个任务获得任何收益。 情况2 - 您重构数据库调用代码以生成新线程并执行。在这种情况下,您的主执行程序线程将不会挂起,并且当新生成的线程将从数据库获取数据时,它将能够开始处理第二个bolt任务。

除非您在组件中引入自己的并行性,否则我没有看到性能提升,除了其他答案中提到的维护原因之外没有理由运行多个任务。