主要內容:通過spout讀取文件中的內容,然後分別以兩個bolt來處理
package com.panguoyuan.storm.lession2;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.topology.TopologyBuilder;
public class MainTopology {
public static void main(String[] args)throws Exception{
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new ReadFileSpout(),1);
builder.setBolt("bolt", new ProcessBolt(),2).shuffleGrouping("spout");
Config config = new Config();
config.setDebug(true);
if(args != null && args.length > 0){
StormSubmitter.submitTopology(args[0], config, builder.createTopology());
}else{
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("MainTopology-lession2", config, builder.createTopology());
}
}
}
2.Spout開發
package com.panguoyuan.storm.lession2;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Map;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichSpout;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;
public class ReadFileSpout implements IRichSpout{
private static final long serialVersionUID = 1L;
private FileInputStream fis;
private InputStreamReader isr;
private BufferedReader br;
private SpoutOutputCollector collector = null;
@Override
public void ack(Object arg0) {
System.out.println("spout.ack()=="+arg0.toString());
}
@Override
public void activate() {
}
@Override
public void close() {
try{
if(this.fis != null){
this.fis.close();
}
if(this.isr != null){
this.isr.close();
}
if(this.br != null){
this.br.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void deactivate() {
}
@Override
public void fail(Object arg0) {
System.out.println("spout.fail()=="+arg0.toString());
}
@Override
public void nextTuple() {
String line = "";
try{
if((line = br.readLine())!=null){
collector.emit(new Values(line));
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void open(Map arg0, TopologyContext arg1, SpoutOutputCollector arg2) {
try{
fis = new FileInputStream("track.log");
isr = new InputStreamReader(fis);
br = new BufferedReader(isr);
collector = arg2;
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
3.Bolt開發
package com.panguoyuan.storm.lession2;
import java.util.Map;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Tuple;
public class ProcessBolt implements IRichBolt {
private static final long serialVersionUID = 1L;
private OutputCollector collector = null;
private int num ;
@Override
public void cleanup() {
}
@Override
public void execute(Tuple tuple) {
String line = tuple.getStringByField("line");
if(!"".equals(line) && line != null){
num ++;
System.err.println(Thread.currentThread().getName()+" lines:"+num+" sessionId:"+line.split("\t")[1]);
collector.ack(tuple);
}
}
@Override
public void prepare(Map arg0, TopologyContext arg1, OutputCollector arg2) {
collector = arg2;
}
@Override
public void declareOutputFields(OutputFieldsDeclarer arg0) {
}
@Override
public Map<String, Object> getComponentConfiguration() {
return null;
}
}
輸出結果