Maven——本地/Storm集群模式运行第一个helloworld项目

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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值