本地/集群运行项目
1.创建maven项目
修改运行环境,右键,选择Propertise
修改编译环境
2.添加依赖
3.创建项目包
4.编写java代码
PWSpolt:
package com.xnmzdx.storm.spolt;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
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;
public class PWSpolt extends BaseRichSpout{
/**
* 添加序列ID
*/
private static final long serialVersionUID = 1L;
private SpoutOutputCollector collector;
private static Map<Integer, String> map = new HashMap<Integer,String>();
static{
map.put(0,"java");
map.put(1,"storm");
map.put(2,"scala");
map.put(3,"hadoop");
map.put(4,"bigdata");
}
// 初始化
@Override
public void open(Map map, TopologyContext context, SpoutOutputCollector collector) {
// 对spolt初始化
this.collector = collector;
}
// 轮询方法,对数据源的数据进行处理
@Override
public void nextTuple() {
Random r = new Random();
int num = r.nextInt(5);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 发送数据
collector.emit(new Values(map.get(num)));
}
// 定义发送的数据字段名
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("print"));
}
}
PrintBolt:
package com.xnmzdx.storm.bolt;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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 PrintBolt extends BaseBasicBolt{
/**
*
*/
private static final long serialVersionUID = 7422832656771957355L;
private static Log log = LogFactory.getLog(PrintBolt.class);
// 处理数据
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
// 接收数据
String print = input.getStringByField("print");
// 数据写到日志中
log.info("【print】:"+print);
// 发送数据
collector.emit(new Values(print));
}
//
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("write"));
}
}
WriteBolt:
package com.xnmzdx.storm.bolt;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
public class WriteBolt extends BaseBasicBolt {
/**
*
*/
private static final long serialVersionUID = -1461121833051557819L;
private static Log log = LogFactory.getLog(PrintBolt.class);
private FileWriter fw;
@Override
public void execute(Tuple input, BasicOutputCollector collector) {
// 接受数据
String write = input.getStringByField("write");
try {
if (fw == null) {
if (System.getProperty("os.name").equalsIgnoreCase("Windows 10")) {
fw = new FileWriter("D:\\stormtest\\" + this);
} else if (System.getProperty("os.name").equalsIgnoreCase("Windows 8.1")) {
fw = new FileWriter("D:\\stormtest\\" + this);
} else if (System.getProperty("os.name").equalsIgnoreCase("Windows 7")) {
fw = new FileWriter("D:\\stormtest\\" + this);
} else if (System.getProperty("os.name").equalsIgnoreCase("Linux")) {
fw = new FileWriter("/home/temp/" + this);
}
}
log.info("【write】:写入文件");
// 把数据写到文件中
fw.write(write);
fw.write("\n");
fw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
}
}
PWTopology:
package com.xnmzdx.storm.topolopy;
import com.xnmzdx.storm.bolt.PrintBolt;
import com.xnmzdx.storm.bolt.WriteBolt;
import com.xnmzdx.storm.spolt.PWSpolt;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
public class PWTopology {
public static void main(String[] args) {
// 创建拓扑的配置对象
Config cgf = new Config();
// 启动两个worker进程
cgf.setNumWorkers(2);
cgf.setDebug(true);
// 创建Topolopy类
TopologyBuilder builder = new TopologyBuilder();
// 组织spolt和bolt
builder.setSpout("spout", new PWSpolt());
builder.setBolt("print-bolt", new PrintBolt()).shuffleGrouping("spout");
builder.setBolt("write-bolt", new WriteBolt()).shuffleGrouping("print-bolt");
// 本地模式
LocalCluster cluster = new LocalCluster();
// 提交Topology
cluster.submitTopology("top1", cgf, builder.createTopology());
// 休息10秒后关闭拓扑
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
cluster.killTopology("top1");
// 关闭本地集群
cluster.shutdown();
}
}
5.运行"HelloWorld"项目
1.本地模式
a.在D盘创建stormtest目录
b.本地运行PWTopology.java
c.进入D盘查看输出文件
2.集群模式
将PWTopology.java文件改为集群模式
package com.xnmzdx.storm.topolopy;
import com.xnmzdx.storm.bolt.PrintBolt;
import com.xnmzdx.storm.bolt.WriteBolt;
import com.xnmzdx.storm.spolt.PWSpolt;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
public class PWTopology {
public static void main(String[] args) {
// 创建拓扑的配置对象
Config cgf = new Config();
// 启动两个worker进程
cgf.setNumWorkers(2);
cgf.setDebug(true);
// 创建Topolopy类
TopologyBuilder builder = new TopologyBuilder();
// 组织spolt和bolt
builder.setSpout("spout", new PWSpolt());
builder.setBolt("print-bolt", new PrintBolt()).shuffleGrouping("spout");
builder.setBolt("write-bolt", new WriteBolt()).shuffleGrouping("print-bolt");
// 集群模式
try {
StormSubmitter.submitTopology("top1", cgf, builder.createTopology());
} catch (AlreadyAliveException e) {
e.printStackTrace();
} catch (InvalidTopologyException e) {
e.printStackTrace();
}
}
}
a.将maven项目打成jar包,上传到Storm集群主节点storm01的/home/stormjars中
此时在target目录下就有相应的jar包
注意:此jar包必须是集群模式的jar包,否则会出错
创建/home/temp目录,用于存储输出的数据
b.启动zookeeper集群和storm集群,jps查看进程
3个节点启动zookeeper进程
zkServer.sh start
zkServer.sh status
主节点启动nimbus和ui进程
storm nimbus >/dev/null 2>&1 &
storm ui >/dev/null 2>&1 &
两个从节点启动supervisor进程
storm supervisor >/dev/null 2>&1 &
jps查看进程
storm01:
storm02:
storm03:
c.在主节点的stormjars目录下提交作业
提交 Storm Topology: storm jar mycode.jar storm.MyTopology arg1 arg2 … mycode.jar:包含 Topology 实现代码的 jar 包
storm.MyTopology:main 方法的入口,即 main 方法所在类名
arg1、arg2 等为 main 方法参数
当出现下面这一行是,说明文件提交成功,否则提交失败。
列出 Storm Topology: storm list
查看两个从节点是否有worker进程
tail -f 实时查看文件的写入过程。
暂停 Storm Topology: storm deactivate {topologyname}
此时再tail -f 实时查看文件写入过程,文件是不写入状态
停止 Storm Topology: storm kill {topologyname}
d.关闭zookeeper集群和storm集群
zkServer.sh stop
kill -9 进程编号:关闭nimbus和supervisor