风暴:何时使用setNumTasks?

时间:2015-06-15 16:38:52

标签: apache-storm

我很想知道需要使用 setNumTasks 功能的情况。文档说默认是每个执行者的一项任务。

如果我有一个'昂贵'的数据库任务(调用需要时间的外部数据库)来运行任何一方都有“快速”任务的螺栓,那么我是否应该为此添加额外的任务?

或者这是其中一个'尝试它,看看会发生什么'的情景?

2 个答案:

答案 0 :(得分:4)

  • 任务数总是> =执行者数量
    • 可以更改执行程序的数量(不破坏拓扑),但必须遵守约束num tasks> = num executors。也就是说,如果您有比执行程序更多的任务,则可以重新平衡拓扑并为其提供更多执行程序。

如何确定您需要多少执行者/任务?

  • 寻找瓶颈,你指出的那个是好的,访问外部数据源的延迟(查看风暴UI上的螺栓过程延迟)。在这种情况下,你可以(可能应该)在这个螺栓上有更多的执行单元;如果你有"备用"你可以将它们提升为执行者的任务。
  • 另一个瓶颈是CPU使用率(查看风暴UI上的螺栓容量),CPU密集度大的螺栓需要更多的执行单元。

我建议你阅读this page

答案 1 :(得分:3)

我刚刚验证了这一点,并找到了为什么会出现关于任务的混乱。

在这种情况下:

find()

int BoltParallelism = 3; int BoltTaskParallelism = 2; builder.setBolt("bolt1", new BoltA(), BoltParallelism) .setNumTasks(BoltTaskParallelism) 确实是执行者的数量,而BoltParallelism确实是任务的数量。

但是

BoltTaskParallelism

当您未指定int BoltParallelism = 3; builder.setBolt("bolt1", new BoltA(), BoltParallelism) 时,Storm会创建setNumTasks个任务,并创建BoltParallelism个执行程序。

如果您创建了3个任务,那么Storm会创建3个Bolt A实例。如果您在BoltA的一个实例中发生了昂贵的数据库读取,那么很可能其他BoltA实例也会做同样的事情,因为它是同一个班级。但是,如果你编写逻辑的方式使得BoltA类可能在某些情况下执行数据库读取,而在其他条件下执行其他处理,那么是;值得拥有更多任务,值得让每个任务在不同的执行器(线程)中运行,因为如果你有3个任务而且只有一个执行器,那么任务将由执行者逐个运行。