在Storm集群中,运行Topolopy的实体有三个:工作进程,executor(线程),task(任务),下图可以形象的说明他们之间的关系。

  Storm的并行度-LMLPHP

工作进程

  Storm集群中的一台机器会为一个或则多个Topolopy运行一个或则多个工作进程。每个工作进程执行Topology的一个子集,一个工作进程属于一个特定的Topology,并为该Topology启动一个或则多个executor。

  可以通过backtype.storm.Config的选项TOPOLOGY_WORKERS来设置工作进程数,也可以通过config的方法setNumWorkers来设置工作线程数。例如:

config.setNumWorkers();//设置工作线程数为2

Executor

  Executor是由一个工作进程启动的线程,在一个工作进程中可以有一个或则多个Executor。一个Executor会为每一个Spout或则Solt运行一个或则多个任务,每一个线程只会为一个Spout或则Solt服务。

  每个Executor都需要单独的配置,在TopologyBuilder类中有setSpout和setBolt两个方法,分别用来设置Spout和Solt初始化时的Executor数量,如果不适用带有parallelism_hint参数的方法设置,默认的Executor的数量为1。

任务

  任务是真正处理数据的实体,每一个Spout或则Solt都在集群中运行一个多则多个任务,在每个Topology中每个组件的任务数都是不变的,但是每个组件的Executor数是可以修改的。即线程数<任务数。默认情况下任务数和线程数设置为相等。

  每个组件启动多少个任务需要单独的配置,backtype.storm.Config的选项TOPOLOGY_TASKS用于配置每个组件启动多少个任务。在ComponentConfigurationDeclarer接口中有一个方法setNumTasks可以设置每个组件的任务数。  

TopologyBuilder topologyBuilder = new TopologyBuilder();
topologyBuilder.setSpout("word",new TestWordSpout(),).setNumTasks();

如何更新运行中的Topology的并行度?

  Storm的一个很好的功能是你可以动态的增加或则减少工作线程或则Executor,而不需要重启集群,这种模式叫做rebalancing。可以通过两种方式进行Rebalance操作

  1.通过StormUI的界面操作

  2.使用命令行工具storm Rebalance 例如:

storm rebalance wordcount -n  -e readSpout= countSolt=

  在这个例子中,将wordcount的工作进程调整为5,将readSpout的Executor数量调整为3,将countSolt的Executor数量调整为10

  

05-11 18:31