Storm集群安装及wordcount案例

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界面查看信息。
这里写图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值