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. MySQL-第十三篇使用ResultSetMetaData分析结果集

    1.Result里面包含了一个getMetaData()方法,该方法返回该ResultSet对应的ResultSetMetaData对象. 2.ResultSetMetaData包含的方法: 1> ...

  2. 通过document.domain实现跨域访问

    通过document.domain实现跨域访问:https://blog.csdn.net/nlznlz/article/details/79506655 前端跨域方法之document.domain ...

  3. 错排问题 && 洛谷 P1595 信封问题

    传送门 一道裸的错排问题 错排问题 百度百科上这样说 就是对于一个排列,每一个数都不在正确的位置上的方案数.n 个元素的错排数记为 D(n). 公式 D(n)=(n−1)∗(D(n−2)+D(n−1) ...

  4. 使用ssh协议在linux主机之间快速上传和下载文件

    scp 要上传的文件 上传主机用户名@主机地址:要上传的主机目录 例如: scp *20181111*.gz inas@10.2.13.57:/INAS/dsgbak/20181110 表示将当前目录 ...

  5. 什么是 Python 自省?

    Python 自省是 Python 具有的一种能力,使程序员面向对象的语言所写的程序在运行时,能够获得对象的类 Python 型.Python 是一种解释型语言,为程序员提供了极大的灵活性和控制力.

  6. Gradle Could not find method leftShift() for arguments

    task hello << { println 'Hello world!' } 其中 << 在gradle 在5.1 之后废弃了 可以查看gradle 版本号 gradle ...

  7. 使用absolute实现的后台布局,包括小图标定位,菜单弹出等完整版

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 《快学scala》读书笔记(2)

    第二章  控制结构和函数 1.条件表达式 (1)scala中if/else表达式有值,这个值就是跟在if或者else之后的表达式的值.如: if (x > 0) 1 else -1 这个表达式的 ...

  9. HTML导航框架实现

    导航栏界面(html_contents.html) <!DOCTYPE html> <html> <head> <meta charset=” utf-8” ...

  10. 如何在Set集合中避免重复元素

    文章翻译自 Avoiding near-duplicates in sets, 作者Paul Hudson @twostraws是一名优秀的Swifter. 这是我第一次翻译,可能有翻译不到位的地方, ...