典型的问题是word总数和word个数(去重)并且在高并发情况下完成
一个topology可以包含一个或多个worker(并行的跑在不同的机器上),所以worker process就是执行一个topology的子集,并且worker只能对应于一个topology
一个worker可用包含一个或多个executor(线程), 每个component(组件)(spout或bolt)至少对应一个executor,所以可以说executor执行一个compenent的子集,同时一个executor只能对应一个component。
task就是具体的处理逻辑对象,一个executor线程可以执行一个或多个tasks,但一般默认每个executor只执行一个task,所以我们往往认为task就是执行线程,其实并不是
task代表最大并发度,一个component的task数量是不会改变的,但是一个component的executor数目是会发生改变的(storm rebalance命令就可以调整executor的数目以达到平衡)
task数>=executor数,executor数代表实际并发数
设置task数可以用:builder.setBolt("bolt",new MyBolt(), 1).setNumTasks(2).shuffleGrouping("spout");
典型的问题是word总数和word个数(去重)并且在高并发情况下完成:
package wordcount; import backtype.storm.task.TopologyContext; import backtype.storm.topology.BasicOutputCollector; import backtype.storm.topology.FailedException; import backtype.storm.topology.IBasicBolt; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.tuple.Tuple; import java.util.HashMap; import java.util.Iterator; import java.util.Map; /** * Created by Administrator on 2016/10/6. */ public class SumBolt implements IBasicBolt{ private static final long serialVersionUID = 1L; Map<String, Integer> counts = new HashMap<String, Integer>(); @Override public void prepare(Map map, TopologyContext topologyContext) { } @Override public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) { try{ long word_sum = 0;//总数 long word_count = 0;//个数,去重后 String wordString = tuple.getString(0); Integer countInteger = tuple.getInteger(1); counts.put(wordString, countInteger); //获取总数,遍历counts的walues,进行sum Iterator<Integer> i = counts.values().iterator(); while(i.hasNext()){ word_sum += i.next(); } //获取word去重的个数,其实就是遍历map的keyset,取个数count Iterator<String> i2 = counts.keySet().iterator(); while(i2.hasNext()){ String oneWordString = i2.next(); if(oneWordString != null){ word_count ++; } } System.out.println("word_sum="+word_sum+"; word_count:"+word_count); }catch (Exception e){ throw new FailedException("SumBolt fail!"); } } @Override public void cleanup() { } @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { } @Override public Map<String, Object> getComponentConfiguration() { return null; } }