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
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章