1.main方法:
package com.bjsxt.wc;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
public class Test {
public static void main(String[] args) {
TopologyBuilder tb=new TopologyBuilder();
tb.setSpout("wcspout", new WordCount(),2);
tb.setBolt("wssplit", new WsSplit(),4).shuffleGrouping("wcspout");
tb.setBolt("wcountbolt", new WcountBolt(),2).setNumTasks(4).fieldsGrouping("wssplit",new Fields("word"));
Config config=new Config();
if (args.length>0) {
try {
StormSubmitter.submitTopology(args[0], config, tb.createTopology());
} catch (AlreadyAliveException | InvalidTopologyException e) {
e.printStackTrace();
}
}
LocalCluster lc=new LocalCluster();
lc.submitTopology("wc",new Config(),tb.createTopology());
}
}
2.Spout方法:
package com.bjsxt.wc;
import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Random;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
import backtype.storm.utils.Utils;
public class WordCount extends BaseRichSpout{
Map map;
TopologyContext context;
SpoutOutputCollector collector;
String [] text= {
"nihao sxt haha",
"sxt welcome good",
"nihao sxt hello"
};
Random r = new Random();
@Override
public void nextTuple() {
List line = new Values(text[r.nextInt(text.length)]);
this.collector.emit(line);
System.err.println("spout_______________________"+line);
Utils.sleep(1000);
}
@Override
public void open(Map map, TopologyContext context, SpoutOutputCollector collector) {
this.map=map;
this.context=context;
this.collector=collector;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));
}
}
3.split切分:
package com.bjsxt.wc;
import java.util.List;
import java.util.Map;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class WsSplit extends BaseRichBolt{
OutputCollector collector;
@Override
public void execute(Tuple input) {
//接收数据
String line=input.getString(0);
//切割数据
String [] words=line.split(" ");
//循环向后推送
for (String word : words) {
List w = new Values(word);
this.collector.emit(w);
}
}
@Override
public void prepare(Map arg0, TopologyContext arg1, OutputCollector collector ) {
this.collector=collector;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
}
}
4.Boult:
package com.bjsxt.wc;
import java.util.HashMap;
import java.util.Map;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;
public class WcountBolt extends BaseRichBolt{
OutputCollector collector;
Map<String, Integer> Map = new HashMap<>();
@Override
public void execute(Tuple input) {
//接收数据
String word=input.getStringByField("word");
int count=1;
//判断是否出现该单词,如果已经出现,则数量递增,否则,将新的单词存入map中
if(Map.containsKey(word)) {
count=Map.get(word)+1;
}
Map.put(word, count);
System.out.println(word+"_______________________+++++++++"+count);
}
@Override
public void prepare(Map arg0, TopologyContext arg1, OutputCollector collector) {
this.collector=collector;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}