storm 并行度说明

    xiaoxiao2022-07-03  129

    并行度,即 executor的个数,就是 线程的数量。

    1、Worker

    Worker是进程级别的,一个worker进程 对应执行一个 Topology 服务,一个运行中的 Topology 是由集群中的多个Worker进程组成的 。 反过来说,一个Worker里面不会运行属于不同的 Topology 的执行任务。

    2、Executor

    这里的 Executor,即线程,也是执行度 ,也是并行度。

    Executor 是线程级别,一个Worker进程里有多个Executor线程,默认一个Executor运行一个task, 一个 Executor中只能运行隶属于同一个 component(spout/bolt)的 task 。 我们常说的 并行度,也就是 Executor 的个数。

    3、Task

    Task 是实例级别,一个Task对应一个 new Bolt() 或者一个new Spout() ; 一个 Executer 线程默认执行一个 Task,也可以设置为执行多个Task ; 如果一个 bolt 或 spout 有设置多个 Task ,Executor 就会在每次循环里顺序调用所有的task实例 每个 component( Spout/ Bolt)的 并发度 就是这个 component 对应的 task数量。 同时,Task 也是各个节点之间进行 grouping(partition)的单位。

    4、默认

    默认情况下一个 supervisor 节点会启动 4个worker 进程 ; 每个 worker 进程会启动 1个 executor 线程 ; 每个 executer 会启动1 个 task;

    5、代码示例

    Config cfg = new Config(); cfg.setNumWorkers(2); //设置使用 2个工作进程(JVM) cfg.setDebug(false); TopologyBuilder builder = new TopologyBuilder(); //设置 spout 的并行度和任务数(2个线程 和 2个任务) builder.setSpout("spout", new PWSpout(), 2); //设置 print-bolt 的并行度和任务数:(2个线程 和 4个任务) builder.setBolt("print-bolt", new PrintBolt(), 2).shuffleGrouping("spout").setNumTasks(4); //设置 write-bolt 的并行度和任务数:(产生6 个线程 和 6个任务) builder.setBolt("write-bolt", new WriteBolt(), 6).shuffleGrouping("print-bolt");

    上面代码中,

    进程数 ( JVM )= 2个workers = 2

    线程数(Executor)= PWSpout (2) + PrintBolt (2) + WriteBolt (6) = 10

    任务(Task)= PWSpout (2) + PrintBolt (4) + WriteBolt (6) = 12

    总上可以得出:

    10个线程/2个进程 = 5个线程/进程。

    12个任务/2个进程 = 6 个任务/进程 ,所以每个工作进程( JVM )领到的 Task是12/2=6,即6个Task。

    print-bolt :

    线程数 = 2,任务 = 4

    4/2=2 ,即每个 print-bolt 线程有 2个 任务。

    默认情况下 ,一个 Executor 只执行一个任务,但如果指定了多个任务,则任务会平均分配到 Executor 中。

    最新回复(0)