1、安装一个zookeeper集群
2、上传storm的安装包,解压
3、修改配置文件storm.yaml
#所使用的zookeeper集群主机
storm.zookeeper.servers:
- "zjgm01"
- "zjgm02"
- "zjgm03"
#nimbus所在的主机名
nimbus.host: "zjgm01"
启动storma
在nimbus主机上
nohup ./storm nimbus
nohup ./storm ui
在supervisor主机上
nohup ./storm supervisor
结果
网址 192.168.2.100:880
OkBolt代码
package com.zhongruan.storm;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;
public class OkBolt extends BaseBasicBolt {
FileWriter fileWriter=null;
@Override
public void prepare(Map stormConf, TopologyContext context) {
try {
fileWriter=new FileWriter("/home/hadoop/stormdata/"+ UUID.randomUUID());
} catch (IOException e) {
e.printStackTrace();
}
}
public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
String name=tuple.getString(0);
String fName=name+"_ok";
try {
fileWriter.write(fName);
fileWriter.write("\n");
fileWriter.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
}
RandomSpount代码
package com.zhongruan.storm;
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 java.util.Random;
import java.util.Map;
public class RandomSpount extends BaseRichSpout {
String[]phones={"iphone","huawei","xiaomi","xiaolajiao","meizu"};
private SpoutOutputCollector collector;
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.collector=spoutOutputCollector;
}
public void nextTuple() {
Random random=new Random();
int index=random.nextInt(phones.length);
String phonename=phones[index];
collector.emit(new Values(phonename));
}
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("pn"));
}
}
ToMain 代码
package com.zhongruan.storm;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.generated.StormTopology;
import backtype.storm.topology.TopologyBuilder;
public class ToMain {
public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException {
TopologyBuilder builder=new TopologyBuilder();
builder.setSpout("randomSpount",new RandomSpount());
builder.setBolt("upperBolt",new UpperBolt(),4).shuffleGrouping("randomSpount");
builder.setBolt("okBolt",new OkBolt(),4).shuffleGrouping("upperBolt");
StormTopology topology=builder.createTopology();
Config conf=new Config();
conf.setNumWorkers(4);
StormSubmitter.submitTopology("ramtopology",conf,topology);
}
}
UpperBolt 代码
package com.zhongruan.storm;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class UpperBolt extends BaseBasicBolt {
public void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {
String phonename=tuple.getString(0);
String upName=phonename.toUpperCase();
basicOutputCollector.emit(new Values(upName));
}
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("uppername"));
}
}
打包上传linux