提交任务:storm jar storm-starter-topologies-1.0.1.jar org.apache.storm.starter.WordCountTopology word-count
查询任务:storm list
Kill任务:storm kill word-count
1) 使用rebalance命令动态调整并发度
Storm提供了rebalance命令,可以动态调整Topology的Worker数量和Component的并发度,而不用修改Topology的代码。如果想动态增加某个Component的并发度,需要设置Component的NumTask数量或者MaxTaskParallelism的参数值,并且大于并发度参数值(parallelism_hint)的值。如果不设置NumTask数量,默认值等同于并发度,重新平衡的时候就只能减少并发度,而不能再增加了。
SentenceSpout spout=new SentenceSpout();
SplitSentenceBolt splitbolt=new SplitSentenceBolt();
WordCountBolt countbolt=new WordCountBolt();
ReportBolt reportbolt=new ReportBolt();
TopologyBuilder builder=new TopologyBuilder();
// 设置并发为2个executor,每个Task指派各自的executor线程
builder.setSpout(SENTENCE_SPOUT_ID,spout,5).setMaxTaskParallelism(10);
// 设置并发为2个executor,每个executor执行2个task
builder.setBolt(SPLIT_BOLT_ID,splitbolt,8).shuffleGrouping(SENTENCE_SPOUT_ID).setNumTasks(16);
// 有时候我们需要将特定数据的tuple路由到特殊的bolt实例中,在此我们使用fieldsGrouping
// 来保证所有"word"字段值相同的tuple会被路由到同一个WordCountBolt实例中
builder.setBolt(COUNT_BOLT_ID,countbolt,12).fieldsGrouping(SPLIT_BOLT_ID,new Fields("words"));
builder.setBolt(REPORT_BOLT_ID,reportbolt).globalGrouping(COUNT_BOLT_ID);
/*Map conf=new HashMap();
conf.put(Config.TOPOLOGY_WORKERS,4);
conf.put(Config.TOPOLOGY_DEBUG,true);*/
Config conf = new Config();
conf.setDebug(true);
conf.setNumWorkers(3);
LocalCluster cluster=new LocalCluster();
cluster.submitTopology(TOPOLOGY_NAME,conf,builder.createTopology());
// Thread.sleep(1000);
// cluster.shutdown();
在构建Topology的过程中,指定了Spout的初始并发度为5,也就是会启动5个Executor线程来运行,然后设定最大并发度为10,上限为10个Executor线程;同时也指定了Split初始并发度为8,最大的Task数量为16个。在运行过程中,我们发现Spout或者Split的性能是瓶颈,可以通过调整并发度来提供性能。Spout并发度上限为10个,Split的最大并发度为16个。
storm rebalance word-count -w 10 -n 4 -e spout=8 -e split=12
Storm通过自己内部的重新部署和分配,来完成并发度的调整。等待10s后,Topology进入重新分配状态,等重新分配完成后,就可以在Storm UI上看见新的结果了。