Storm学习笔记(五)——Storm的并发机制

目录

Storm数据流分组

Stream消息流

Stream Grouping消息流组

Storm并发机制

Storm的并发度

增加Storm的并发度的代码


Storm数据流分组

词频统计的Topology的并发可以如下图所示:

Storm学习笔记(五)——Storm的并发机制_第1张图片

WordCountSpout---->SplitBolt 过程:发送的是一行一行的数据,任何一个SplitBolt都可进行处理。

SplitBolt--->WordCountBolt 过程:发送的是一个一个的单词,同一个单词必须发给同一个WordCountBolt

WordCountBolt--->ReportBolt 过程:发送的是单词和频次,收到后打印输出即可

Stream消息流

Stream是Storm中最关键的抽象,是一个没有边界的Tuple序列,这些Tuple以分布式的方式并行地常见和处理。定义消息流主要是定义消息流中的Tuple。每个消息流在定义时都会分配一个ID,因为单向消息流很普遍,OutputFieldsDeclarer定义了一些方法可以定义一个流而不指定其ID。在这种情况下,该流有一个默认的ID。

Stream Grouping消息流组

定义Topology的其中一步是定义每个Bolt接受何种流作为输入。Stream Grouping(消息流组)就是用来定义一个流如何分配Tuple到Bolt。Storm包括6种流分组类型。

  1. 随机分组(Shuffle Grouping):随机分发元组到Bolt,并保证每个Bolt获得相等数据量的元组。可以实现一个近似的负载均衡的效果。
  2. 字段分组(Fields Grouping):根据指定字段分割数据流并分组。例如,根据“user-id”字段,具有该字段的Tuple被分到相同的Bolt中,不同的“user-id”值则会被分配到不同的Bolt中。(注:之前的单词统计就用到了这种分组,从而能够确保相同单膝被发往一个Bolt去处理。)
  3. 全复制分组(All Grouping):对于每个Tuple来说,所有的Bolt都会受到,所有的Tuple被复制到Bolt的所有任务上,需要小心使用该分组。
  4. 全局分组(Global Grouping):全部的流都分配到唯一的一个Bolt上,就是分配给ID最小的Task。(注:这种模型,对应的Bolt所设定的并发度没有意义,因为最后一个Bolt在进行处理。)
  5. 不分组(None Grouping):不分组的含义是,流不关心到底谁会接收它的Tuple。目前无分组等效于随机分组。
  6. 直接分组(Direct Grouping):只是一个特别的分组类型。元组产生者决定元组由哪个元组消费者任务接收。
  7. 本地或随机分组(Local or shuffle Grouping):和随机分组类似,但是,会将Tuple分发给同一个Worker内的Bolt Task,其他情况下采用随机分组方式。这种方式可以减少网络传输,从而提高Topology的性能。

Storm并发机制

关于Storm集群中的并发度的四个概念:

  1. Node(服务器):指Storm集群中的一个服务器,会执行Topology的一部分运算,一个Storm集群中包含一个或者多个Node。
  2. Worker(JVM进程):指一个Node上相互独立运行的JVM进程,每个Node可以配置运行一个或者多个worker。一个Topology会分配到一个或者多个worker上运行。
  3. Task(bolt/spout实例):指spout和bolt的实例,他们的nextTuple()和execute()方法会被executors线程调用执行。
  4. Executor(执行线程):指一个worker的JVM中运行的java线程。Storm默认会给每个executor分配一个task。此外,多个task也可以指派给同一个executor来执行,但需要明确指示。

Storm的并发度

Storm的默认并发度设置值为1。(一台服务器Node---为Topology分配一个worker---每个executor执行一个task)如图。

Storm学习笔记(五)——Storm的并发机制_第2张图片

此时唯一个并发机制出现在线程级。单机模式下增加并发的方式可以体现在分配更多的worker和executor给Topology,增加worker进程如图。

Storm学习笔记(五)——Storm的并发机制_第3张图片

增加executor线程如图:

Storm学习笔记(五)——Storm的并发机制_第4张图片

当然,单机模式下,增加worker的数量并不会有任何提升速度的效果。

增加Storm的并发度的代码

增加worker:可以通过API和修改配置两种方式修改分配给Topology的worker数量

Config config = new Config();
config.setNumWorkers(2);

增加Executor:

builder.setSpout(spout_id,spout,2);//将spout的executor并发度设为2,如果不设置task并发度,则task的并发度也为2,因为默认是一个线程执行一个task
builder.setBolt(bolt_id,bolt,executor_num);

增加Task:

builder.setSpout(...).setNumTasks(2);
builder.setBolt(...).setNumTasks(task_num);

 

你可能感兴趣的:(#,Storm,java,storm,多线程,大数据,分布式)