Storm集群部署
1、下载安装包
2、解压安装包
#解压到平台
tar -zxvf apache-storm-0.9.5.tar.gz -C /usr/local/apps/platform/
#创建软链接
ln -s apache-storm-0.9.5 storm
3、修改配置文件
vi /usr/local/apps/platform/storm/conf/storm.yaml
输入以下内容:
#指定storm使用的zk集群
storm.zookeeper.servers:
- "hadoop1"
- "hadoop2"
- "hadoop3"
#指定storm本地状态保存地址
storm.local.dir: "/usr/local/apps/paltform/storm/workdir"
#指定storm集群中的nimbus节点所在的服务器
nimbus.host: "hadoop1"
#指定nimbus启动JVM最大可用内存大小
nimbus.childopts: "-Xmx1024m"
#指定supervisor启动JVM最大可用内存大小
supervisor.childopts: "-Xmx1024m"
#指定supervisor节点上,每个worker启动JVM最大可用内存大小
worker.childopts: "-Xmx768m"
#指定ui启动JVM最大可用内存大小,ui服务一般与nimbus同在一个节点上。
ui.childopts: "-Xmx768m"
#指定supervisor节点上,启动worker时对应的端口号,每个端口对应槽,每个槽位对应一个worker
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
#指定UI的端口
ui.port:4321
4、分发安装包
拷贝到你要装storm的机器上,然后分别在各机器上创建软连接
scp -r /usr/local/apps/platform/storm/ hadoop2:/usr/local/apps/platform/
scp -r /usr/local/apps/platform/storm/ hadoop3:/usr/local/apps/platform/
5、启动集群
在nimbus.host所属的机器上启动 nimbus服务
./storm nimbus &
在nimbus.host所属的机器上启动ui服务
./storm ui &
在其它个点击上启动supervisor服务
./storm supervisor &
6、查看集群
访问nimbus.host:/4321,即可看到storm的ui界面。
Storm常用操作命令
有许多简单且有用的命令可以用来管理拓扑,它们可以提交、杀死、禁用、再平衡拓扑。
1、提交任务命令格式:storm jar 【jar路径】 【拓扑包名.拓扑类名】 【拓扑名称】
bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount
2、杀死任务命令格式:storm kill 【拓扑名称】 -w 10(执行kill命令时可以通过-w [等待秒数]指定拓扑停用以后的等待时间)
storm kill topology-name -w 10
3、停用任务命令格式:storm deactivte 【拓扑名称】
storm deactivte topology-name
我们能够挂起或停用运行中的拓扑。当停用拓扑时,所有已分发的元组都会得到处理,但是spouts的nextTuple方法不会被调用。销毁一个拓扑,可以使用kill命令。它会以一种安全的方式销毁一个拓扑,首先停用拓扑,在等待拓扑消息的时间段内允许拓扑完成当前的数据流。
4、启用任务命令格式:storm activate【拓扑名称】
storm activate topology-name
5、重新部署任务命令格式:storm rebalance 【拓扑名称】
storm rebalance topology-name
再平衡使你重分配集群任务。这是个很强大的命令。比如,你向一个运行中的集群增加了节点。再平衡命令将会停用拓扑,然后在相应超时时间之后重分配工人,并重启拓扑。
Storm编程入门-wordcount程序
包含一个Topology,一个spout,两个bolt
1.WCTopology
package com.xt.storm.wc;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
/**
* Created by XT on 2018/3/17.
*/
public class WCTopology {
public static void main(String args[]) throws AlreadyAliveException, InvalidTopologyException {
TopologyBuilder tb = new TopologyBuilder();
tb.setSpout("myspout",new MySpout(),2);
tb.setBolt("mybolt1",new mySplitBolt(),2).shuffleGrouping("myspout");
tb.setBolt("mybolt2",new myCountBolt(),4).fieldsGrouping("mybolt1",new Fields("word"));
Config config = new Config();
config.setNumWorkers(2);
//集群运行
StormSubmitter.submitTopology("mywordcount",config,tb.createTopology());
//本地运行
//LocalCluster localCluster = new LocalCluster();
//localCluster.submitTopology("wc",config,tb.createTopology());
}
}
2.MySpout
package com.xt.storm.wc;
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.Map;
/**
* Created by XT on 2018/3/17.
*/
public class MySpout extends BaseRichSpout{
private SpoutOutputCollector collector;
@Override
public void open(Map map, TopologyContext topologyContext, SpoutOutputCollector spoutOutputCollector) {
this.collector = spoutOutputCollector;
}
@Override
public void nextTuple() {
collector.emit(new Values("i love you angela baby"));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("line"));
}
}
3.mySplitBolt
package com.xt.storm.wc;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import java.util.Map;
/**
* Created by XT on 2018/3/17.
*/
public class mySplitBolt extends BaseRichBolt {
private OutputCollector collector;
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
this.collector = outputCollector;
}
@Override
public void execute(Tuple tuple) {
String line = tuple.getStringByField("line");
String[] split = line.split(" ");
for(String s : split){
collector.emit(new Values(s,1));
}
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
outputFieldsDeclarer.declare(new Fields("word","num"));
}
}
4.myCountBolt
package com.xt.storm.wc;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.tuple.Tuple;
import java.util.HashMap;
import java.util.Map;
/**
* Created by XT on 2018/3/17.
*/
public class myCountBolt extends BaseRichBolt {
Map<String,Integer> map = new HashMap();
@Override
public void prepare(Map map, TopologyContext topologyContext, OutputCollector outputCollector) {
}
@Override
public void execute(Tuple tuple) {
String word = tuple.getStringByField("word");
Integer num = tuple.getIntegerByField("num");
if (map.containsKey(word)){
map.put(word,map.get(word) + num);
}else{
map.put(word,num);
}
System.out.println("wc:" + map);
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) {
}
}
打成jar包丢到集群上去运行
storm jar wc.jar com.xt.storm.wc.WCTopology
运行后可以通过storm的日志文件在log目录下查看信息。
也可以通过ui界面查看信息。