package com.mark.storm.mapreduce; import com.mark.storm.mapreduce.service.IOService; import org.apache.storm.spout.SpoutOutputCollector; import org.apache.storm.task.TopologyContext; import org.apache.storm.topology.OutputFieldsDeclarer; import org.apache.storm.topology.base.BaseRichSpout; import org.apache.storm.tuple.Fields; import org.apache.storm.tuple.Values; import org.apache.storm.utils.Utils; import java.util.List; import java.util.Map; /** * Created by fellowlei on 2018/3/4 */ public class FileSentenceSpout extends BaseRichSpout{ SpoutOutputCollector spoutOutputCollector; List<String> lines = null; @Override public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) { this.spoutOutputCollector = spoutOutputCollector; this.lines = IOService.getLines("d:/log.txt"); } @Override public void nextTuple() { for(String line: lines){ Utils.sleep(1000); spoutOutputCollector.emit(new Values(line)); } } @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("sentence")); } }
package com.mark.storm.mapreduce; import org.apache.storm.task.OutputCollector; import org.apache.storm.task.TopologyContext; import org.apache.storm.topology.OutputFieldsDeclarer; import org.apache.storm.topology.base.BaseRichBolt; import org.apache.storm.tuple.Fields; import org.apache.storm.tuple.Tuple; import org.apache.storm.tuple.Values; import java.util.Map; /** * Created by fellowlei on 2018/3/4 */ public class MapBolt extends BaseRichBolt { OutputCollector outputCollector; @Override public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) { this.outputCollector = outputCollector; } @Override public void execute(Tuple tuple) { String message = tuple.getString(0); String[] arrays = message.split(" "); for(String word: arrays){ outputCollector.emit(new Values(word,1)); } } @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("word","count")); } }
package com.mark.storm.mapreduce; import org.apache.storm.task.OutputCollector; import org.apache.storm.task.TopologyContext; import org.apache.storm.topology.OutputFieldsDeclarer; import org.apache.storm.topology.base.BaseRichBolt; 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; /** * Created by fellowlei on 2018/3/4 */ public class ReduceBolt extends BaseRichBolt { OutputCollector outputCollector; static Map<String,Integer> map = new HashMap<>(); @Override public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) { this.outputCollector = outputCollector; } @Override public void execute(Tuple tuple) { String word = tuple.getStringByField("word"); Integer count = tuple.getIntegerByField("count"); Integer sum = 0; if(map.containsKey(word)){ sum = count + map.get(word); map.put(word,sum); }else{ map.put(word,count); sum = count; } outputCollector.emit(new Values(word,sum)); } @Override public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) { outputFieldsDeclarer.declare(new Fields("word","sum")); } }
package com.mark.storm.mapreduce; import com.mark.storm.bolt.PrinterBolt; import org.apache.storm.Config; import org.apache.storm.LocalCluster; import org.apache.storm.topology.TopologyBuilder; /** * Created by fellowlei on 2018/3/4 */ public class BoltMapReduce { public static void main(String[] args) { TopologyBuilder topologyBuilder = new TopologyBuilder(); topologyBuilder.setSpout("spout", new FileSentenceSpout(), 1); topologyBuilder.setBolt("map", new MapBolt(), 1).shuffleGrouping("spout"); topologyBuilder.setBolt("reduce", new ReduceBolt(), 1).shuffleGrouping("map"); topologyBuilder.setBolt("print", new PrinterBolt(), 1).shuffleGrouping("reduce"); Config config = new Config(); config.setDebug(false); config.setNumWorkers(1); LocalCluster localCluster = new LocalCluster(); localCluster.submitTopology("mydemo", config, topologyBuilder.createTopology()); } }