在Storm集群中,运行Topolopy的实体有三个:工作进程,executor(线程),task(任务),下图可以形象的说明他们之间的关系。
工作进程
Storm集群中的一台机器会为一个或则多个Topolopy运行一个或则多个工作进程。每个工作进程执行Topology的一个子集,一个工作进程属于一个特定的Topology,并为该Topology启动一个或则多个executor。
可以通过backtype.storm.Config的选项TOPOLOGY_WORKERS来设置工作进程数,也可以通过config的方法setNumWorkers来设置工作线程数。例如:
config.setNumWorkers(2);//设置工作线程数为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(),1).setNumTasks(3);
如何更新运行中的Topology的并行度?
Storm的一个很好的功能是你可以动态的增加或则减少工作线程或则Executor,而不需要重启集群,这种模式叫做rebalancing。可以通过两种方式进行Rebalance操作
1.通过StormUI的界面操作
2.使用命令行工具storm Rebalance 例如:
storm rebalance wordcount -n 5 -e readSpout=3 countSolt=10
在这个例子中,将wordcount的工作进程调整为5,将readSpout的Executor数量调整为3,将countSolt的Executor数量调整为10