1. vim /etc/hosts
ssh免密登录
192.168.132.154 c0
192.168.132.156 c1
192.168.132.155 c2

storm集群:
192.168.132.154 c0
192.168.132.156 c1
192.168.132.155 c2

2. 请在官网下载,并解压。文末有文件下载地址
tar -zxvf apache-storm-1.2.3.tar.gz

配置环境变量(c0,c1,c2都要修改)

vim /etc/profile
# storm
export STORM_HOME=/home/xiaozw/soft/java/storm
export PATH=$PATH:${JAVA_PATH}:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZK_HOME/bin:$SPARK_HOME/bin:${STORM_HOME}/bin
刷新生效
source /etc/profile

3. 修改storm/conf/storm.yaml配置文件

storm.zookeeper.servers:

- "192.168.132.154"
- "192.168.132.156"
- "192.168.132.155"
nimbus.seeds: ["192.168.132.154"]
storm.local.dir:"/home/xiaozw/soft/tmp/storm"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703

创建storm目录(c0,c1,c2都要创建)

mkdir /home/xiaozw/soft/tmp/storm

4. 拷贝storm文件夹到其它集群上(c1,c2)
scp -r /home/xiaozw/soft/java/storm root@c1:/home/xiaozw/soft/java/
scp -r /home/xiaozw/soft/java/storm root@c2:/home/xiaozw/soft/java/

先启动zookeeper,安装zookeeper请查看其它文档。
zkServer.sh start
5. 启动storm
c0,nimbus上启动
./storm nimbus >> /dev/null 2>&1 &
启动界面
storm ui >> /dev/null 2>&1 &

c1,c2 supervisor上启动

./storm supervisor >> /dev/null 2>&1 &

界面查看,http://192.168.132.154:8080

6. java wordcount程序。

package com.xiaozw.demo4.storm;

import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import org.apache.storm.utils.Utils; import java.util.HashMap;
import java.util.Map;
import java.util.Random; public class WordCountTopology {
/**
* spout 继承一个基类,实现接口,这个里面主要是负责从数据源获取数据。
* 简化从内部发射数据。
*/
public static class RandomSentenceSpout extends BaseRichSpout{ private static final long serialVersionUID = -8017609899644290351L; private SpoutOutputCollector collector; private Random random; /**
* 对spout初始化,创建线程,数据库连接
* @param conf
* @param topologyContext
* @param collector
*/
@Override
public void open(Map conf, TopologyContext topologyContext, SpoutOutputCollector collector) {
//初始化数据,SpoutOutputCollector用来发射数据出去,
this.collector=collector;
this.random=new Random();
} /**
* 最终运行在task中,某个worker进程的某个executor线程内部。
* 某个task负责无限循环调用nextTuple方法,
* 形成数据流。
*/
@Override
public void nextTuple() {
Utils.sleep(100);
String[] sentences = new String[] {
"the cow jumped over the moon", "an apple a day keeps the doctor away",
"four score and seven years ago", "snow white and the seven dwarfs",
"i am at two with nature" };
String sentence = sentences[random.nextInt(sentences.length)];
System.err.println("【发射句子】sentence=" + sentence);
collector.emit(new Values(sentence));
} /**
* 发射出去每个tuple中field名称是什么。
* @param declarer
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("sentence"));
}
} /**
* 每个bolt同样是发送到worker某个executor的task中执行
*
* @author Administrator
*
*/
public static class SplitSentence extends BaseRichBolt { private static final long serialVersionUID = -1863792429350238883L; private OutputCollector collector; /**
* 对于bolt来说,第一个方法就是prepare()方法。
*/
@Override
@SuppressWarnings("rawtypes")
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
} /**
* 每接收到一条数据后,就会交给executor方法来执行
*/
@Override
public void execute(Tuple tuple) {
String sentence = tuple.getStringByField("sentence");
if (sentence != null && "".equals(sentence) == false) {
String[] words = sentence.split(" ");
for (String word : words) {
collector.emit(new Values(word));
}
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
} } /**
* 单词计数bolt
*
* @author Administrator
*
*/
public static class WordCount extends BaseRichBolt { private static final long serialVersionUID = -8940950046975910504L; //private static final Logger LOGGER = LoggerFactory.getLogger(WordCount.class); private OutputCollector collector;
private Map<String, Integer> wordCounts = new HashMap<String, Integer>(); @Override
@SuppressWarnings("rawtypes")
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
this.collector = collector;
} @Override
public void execute(Tuple input) {
String word = input.getStringByField("word");
Integer count = wordCounts.get(word);
if (count == null) {
count = 0;
}
wordCounts.put(word, ++count);
System.err.println("【单词计数】" + word + "出现的次数是" + count);
collector.emit(new Values(word, count));
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word", "count"));
} } public static void main(String[] args) throws Exception{
// 在main方法中,会去将spout和bolts组合起来,构建成一个拓扑
TopologyBuilder builder = new TopologyBuilder(); // 第一个参数的意思,就是给这个spout设置一个名字
// 第二个参数的意思,就是创建一个spout的对象
// 第三个参数的意思,就是设置spout的executor有几个
builder.setSpout("RandomSentence", new RandomSentenceSpout(), 5); builder.setBolt("SplitSentence", new SplitSentence(), 10).setNumTasks(20)
.shuffleGrouping("RandomSentence");
// 这里设置fieldsGrouping很重要,相同的单词从SplitSentence发射出来时,一定会进入到下游的指定的同一个task中
// 只有这样子,才能准确的统计出每个单词的数量
builder.setBolt("WordCount", new WordCount(), 10).setNumTasks(20).fieldsGrouping(
"SplitSentence", new Fields("word")); Config config = new Config();
if(args!=null && args.length>0){
config.setNumWorkers(3);
try{
StormSubmitter.submitTopologyWithProgressBar(args[0],config,builder.createTopology());
}
catch (Exception e){
e.printStackTrace();
}
}
else{
config.setMaxTaskParallelism(20);
// 在eclipse本地运行
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("WordCountTopology", config, builder.createTopology());
Utils.sleep(60000);
cluster.shutdown();
}
}
}

打包 mvn clean install -DskipTests
上传jar包到测试服务器

执行命令:

storm jar demo4-1.0-SNAPSHOT.jar com.xiaozw.demo4.storm.WordCountTopology WordCountTopology

 查看UI界面 http://192.168.132.154:8080/index.html

7. 源码和文件下载地址

链接:https://pan.baidu.com/s/1RmBlhZ_p-30clHoUhxycBg
提取码:ik6g

 

storm集群搭建和java应用的更多相关文章

  1. storm集群配置以及java编写拓扑例子

    storm集群配置 安装 修改配置文件 使用java编写拓扑 storm集群配置 storm配置相当简单 安装 tar -zxvf apache-storm-1.2.2.tar.gz rm apach ...

  2. 大数据学习——Storm集群搭建

    安装storm之前要安装zookeeper 一.安装storm步骤 1.下载安装包 2.解压安装包 .tar.gz storm 3.修改配置文件 mv /root/apps/storm/conf/st ...

  3. Redis 3.2 Linux 环境集群搭建与java操作

    redis 采用 redis-3.2.4 版本. 安装过程 1. 下载并解压 cd /usr/local wget http://download.redis.io/releases/redis-3. ...

  4. storm集群搭建

    安装环境: 虚拟操作系统:centOS7 64位  2台 IP地址为192.168.1.10   192.168.1.11 内存:1GB内存 zookeeper版本 :3.4.6 Storm版本:0. ...

  5. redis centos集群搭建和java应用

    1. 首先要ssh免密登录 redis集群,3台虚拟机,6个节点,每台机器2个节点一主一从. 192.168.132.154 c0192.168.132.156 c1192.168.132.155 c ...

  6. redis集群搭建及java(jedis)链接

    1.创建一个redis-cluster 目录 mkdir -p /usr/local/redis-cluster 创建6台redis服务器(单机下学习) mkdir 7001.mkdir 7002.m ...

  7. spark集群搭建(java)未完待续

    环境 操作系统:windows10 虚拟机工具:VMware14.1 NUX版本:Centos7.2(64) JDK:1.8(64) 一.安装linux,master(桥接模式上网),slave(na ...

  8. 一:Storm集群环境搭建

    第一:storm集群环境准备及部署[1]硬件环境准备--->机器数量>=3--->网卡>=1--->内存:尽可能大--->硬盘:无额外需求[2]软件环境准备---& ...

  9. Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境

    一. Storm集群组件 Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node).其分别对应的角色如下: 主控节点(Master Node)上运行一个被称为N ...

随机推荐

  1. 来自python自学者的小问题

    我想使用python的第三方库,但是我的IDE给我一个错误代码: D:\untitled\venv\Scripts\python.exe "D:/py code/venv/sxsxsxsxs ...

  2. VS2017运行emwin模拟机不能运行的解决部分

    宇宙第一开发工具的功能太强大了,今天我们来介绍怎么解决VS2017的C++功能运行emwin模拟机不能运行的解决部分 编译软件:Visual Studio 2017:     emwin模拟机版本:S ...

  3. HDU 6538 Neko and quadrilateral(极角排序+旋转坐标系)

    这道题简直太好了,对于计算几何选手需要掌握的一个方法. 首先对于求解四边形面积,我们可以将四边形按对角线划分成两个三角形,显然此时四边形的面积最大最小值就变成了求解里这个对角线最近最远的点对. 对于此 ...

  4. display:table的几个用法 块级子元素垂直居中

    DIV+CSS的布局已经让表格布局几乎很少用到,除非表格语义性很强的情况. display:table解决了一部分需要使用表格特性但又不需要表格语义的情况, 尤其是DIV+CSS很不方便解决的问题,比 ...

  5. 2019 Multi-University Training Contest 4 - 1010 - Minimal Power of Prime

    http://acm.hdu.edu.cn/showproblem.php?pid=6623 题意,给50000个1e18级别的数N,求它质因数分解里面的最小的指数(不算0) 比赛的时候给划了一个1e ...

  6. HTML拖放元素

    实现来回拖放图片 <!DOCTYPE HTML> <html> <title>来回拖放元素</title> <meta charset=" ...

  7. ReactiveCocoa详解

    最近看了大神的博客后,感觉该对ReactiveCocoa做一个了断了. 首先大致的对以下关于ReactiveCocoa内容做一个简单的总结,其他的后续更新 1.ReactiveCocoa的操作思想 2 ...

  8. 定时器,定时发邮件JavaMail

    一.定时器用法: 1.1先导入jar包 <!--spring整合其他文件时要用的jar包--> <dependency> <groupId>org.springfr ...

  9. JS 控制子页面刷新父页面

    iframe里面的子页,用parent.location.href = parent.location.reload();如果是window.open 打开就用opener.location.relo ...

  10. js函数总结

    最近要经常写一些Js代码,总看到同事能使用js高级函数写出比较简洁的js代码,挺羡慕的,于是就花了一些专门时间来学习. forEach.map.reduce 我就不喜欢一上来就给出语法来,先来一个例子 ...