Storm實現單詞個數統計

 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>

運行結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章