我很想知道需要使用 setNumTasks 功能的情况。文档说默认是每个执行者的一项任务。
如果我有一个'昂贵'的数据库任务(调用需要时间的外部数据库)来运行任何一方都有“快速”任务的螺栓,那么我是否应该为此添加额外的任务?
或者这是其中一个'尝试它,看看会发生什么'的情景?
答案 0 :(得分:4)
如何确定您需要多少执行者/任务?
我建议你阅读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个任务而且只有一个执行器,那么任务将由执行者逐个运行。