2015-06-15 52 views
3

我很想知道需要使用setNumTasks函数的情况。文档说,默认是每个执行者的一项任务。风暴:何时使用setNumTasks?

如果我有一个'昂贵'的数据库任务(需要花费时间的外部数据库调用)在任何一方执行'快速'任务的螺栓运行,我会添加额外的任务吗?

或者,这是那些'尝试它,看看会发生什么'的情景?

回答

4
  • 任务的数量总是> =约束NUM执行人
    • 执行人的数量是可以改变的(而不杀死拓扑)的数量,但是任务> = NUM​​执行人必须尊重。这就是说,如果你有比执行者更多的任务,你可以重新平衡你的拓扑并给它更多的执行者。

如何决定多少执行人/任务你需要什么?

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

我建议你阅读this page

+0

我试着用setNumTasks(10)发送http请求来配置一个螺栓。此请求的响应延迟了3秒。我注意到Bolt实际上是一个接一个地发送请求。所以我仍然困惑。 – prehawk

2

我只是验证了这一点,发现为什么有这种混淆的任务。

在这种情况下:

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) 

如果不指定setNumTasks,风暴造成BoltParallelism多项任务,并创建BoltParallelism执行人的数量为好。

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