一、Strom并行机制
1.概述:
Storm集群中的并发度主要由以下四个概念来决定:
1)Nodes--服务器
指的是Storm集群中的一个服务器,会执行Topology的一部分运算,一个Storm集群中包含一个或者多个Node。
2)Workers--JVM进程
指一个Node上相互独立运作的JVM进程,每个Node可以配置运行一个或多个worker。一个Topology会分配到一个或者多个worker上运行。
3)Executor--执行线程
指一个worker的jvm中运行的java线程。Storm默认会给每个executor分配一个task。此外,多个task也可以指派给同一个executer来执行,但需要明确指定。
4)Task--bolt或spout实例的对象
task是spout和bolt的实例,他们的nextTuple()和execute()方法会被executors线程调用执行。
2.Strom的并发度
Storm的默认并发设置值是1。
即:一台服务器(node)——为topology分配一个worker——每个executor执行一个task。
如下图所示:
此时唯一的并发机制出现在线程级。
在单机模式下增加并发的方式可以体现在分配更多的worker和executer给topology
如下图,增加worker进程:
如下图,增加executor线程:
注:单机模式下,增加worker的数量不会有任何提升速度的效果。
3.如果通过代码增加Strom的并发度
1)增加worker
可以通过API和修改配置两种方式修改分配给topology的woker数量。
代码示例:
Config config = new Config();
config.setNumWorkers(2);
2)增加Executor
代码示例:
builder.setSpout(spout_id,spout,2)
builder.setBolt(bolt_id,bolt,executor_num)
3)增加Task
代码示例:
builder.setSpout(...).setNumTasks(2);
builder.setBolt(...).setNumTasks(task_num);
4.通过单词统计案例来理解并发度
①现在,我们先来设定worker进程数量=2(默认是1)
config.setNumWorkers(2);
②接下来,我们更改executor和task的并发度
builder.setSpout(spout_id,spout,2) //将spout的executor并发度设为2。此外,如果不设定task并发度,则task的并发度也为2,因为默认是一个线程执行一个task。
builder.setBolt(split_bolt_id,splitBolt,2).setNumTasks(4).shuffleGrouping(spout_id);//将splitBolt的线程并发度设为2,task并发度为4。在这种情况下,相当于一个executor执行两个splitBolt的task实例
builder.setBolt(wordcount_bolt_id,wordcountBolt,2)……//设定wordcountBolt的并发度,
此外,ReportBolt的并发度未做设置,所以默认都是一个线程处理一个对应的task实例
最后如图所示(摘自于《Storm分布式实时计算模式》P16):
1.Worker=2
2.SentenceSpout 线程并发度=2 任务并发度=2
3.Split Sentence Bolt 线程并发度=2 任务并发度=4
4.Word Count Bolt 线程并发度=4 任务并发度=4
5.Report Bolt 线程并发度=1 任务并发度=1
二、Strom常见参数配置
示例:
#Storm集群对应的ZooKeeper集群的主机列表
storm.zookeeper.servers:
- "ip01"
- "ip02"
- "ip03"
#Storm集群对应的ZooKeeper集群的服务端口,ZooKeeper默认端口为2181
storm.zookeeper.port: 2181
#Storm的元数据在ZooKeeper中存储的根目录
storm.zookeeper.root: /storm
#整个Storm集群的Nimbus节点
nimbus.host: ip01
#Storm的Slot(槽位)。Slot和Worker是一一对应的。即有一个slot就可以启动一个worker进程。因为进程和进程之间需要通信,比如传输数据,所以需要配置端口号。
配置几个端口,每台服务器就会启动几个slot。(注意端口不要冲突)
配置建议1:因为Storm是基于内存的实时计算,所以在配置Slot个数时,最好是服务器core的整数倍。比如一台服务器8核,slot的个数:8、16、24……
配置建议2:slot个数不要超过: (物理内存 - 虚拟内存)/每个java进程最大的内存使用量
比如:物理内存:64 虚拟内存:4 每个java进程:1
一般配置32个 。
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
- 6704
- 6705
- 6706
- 6707
- 6708
- 6709
- 6710
#Storm集群的UI地址端口号,默认是8080
ui.port :8080