Java代碼
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.IBasicBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.apache.commons.lang3.RandomStringUtils;
public class wordCount {
public static class WordSpout extends BaseRichSpout {
private SpoutOutputCollector collector;
private final Random random = new Random();
String sentence="";
String strRandom= "";
@Override
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.collector = spoutOutputCollector;
}
@Override
public void nextTuple() {
sentence="";
for (int i =0;i<=random.nextInt(20);i++){
strRandom = RandomStringUtils.randomAlphabetic(2, 5);
sentence= sentence + strRandom + " ";
}
System.out.println("nextTuple is :" + sentence.trim());
collector.emit(new Values(sentence.trim()));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("sentence"));
}
}
public static class SplitSentenceBolt implements IBasicBolt {
public void prepare(Map map, TopologyContext topologyContext) {
}
@Override
public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
String sentence = tuple.getString(0);
System.out.println("SplitSentenceBolt execute is :" + sentence);
for (String word : sentence.split(" ")) {
basicOutputCollector.emit(new Values(word));
}
}
@Override
public void cleanup() {
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("word"));
}
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
public static class WordCountBolt implements IBasicBolt {
private Map<String, Integer> mapWordCount = new HashMap<String, Integer>();
@Override
public void prepare(Map map, TopologyContext topologyContext) {
}
@Override
public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
String word = tuple.getString(0);
Integer count = mapWordCount.get(word);
if (count == null) {
count = 0;
}
count++;
mapWordCount.put(word, count);
basicOutputCollector.emit(new Values(word, count));
System.out.println(word + ":" + count);
}
@Override
public void cleanup() {
System.out.println("********** close bolt **********");
for (String key : mapWordCount.keySet()) {
System.out.println(key + " " + mapWordCount.get(key));
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("word", "count"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
public static void main(String[] args) throws Exception {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new WordSpout(), 2);
builder.setBolt("split", new SplitSentenceBolt(), 3).shuffleGrouping("spout");
builder.setBolt("count", new WordCountBolt(), 5).fieldsGrouping("split", new Fields("word"));
Config conf = new Config();
conf.setDebug(false);
if (args != null && args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
} else {
conf.setMaxTaskParallelism(3);
LocalCluster localCluster = new LocalCluster();
String topologyName = "wordCount";
localCluster.submitTopology(topologyName, conf, builder.createTopology());
//Thread.sleep(100000);
//localCluster.killTopology(topologyName);
//localCluster.shutdown();
}
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.storm</groupId>
<artifactId>stormTest</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.storm/storm-core -->
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>1.2.2</version>
<!--在本地模式運行的時候需要把下面的給註釋掉-->
<!--<scope>provided</scope>-->
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
</dependencies>
</project>
運行結果