本地/集羣運行項目
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