storm集群搭建和java应用
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应用的更多相关文章
- storm集群配置以及java编写拓扑例子
storm集群配置 安装 修改配置文件 使用java编写拓扑 storm集群配置 storm配置相当简单 安装 tar -zxvf apache-storm-1.2.2.tar.gz rm apach ...
- 大数据学习——Storm集群搭建
安装storm之前要安装zookeeper 一.安装storm步骤 1.下载安装包 2.解压安装包 .tar.gz storm 3.修改配置文件 mv /root/apps/storm/conf/st ...
- Redis 3.2 Linux 环境集群搭建与java操作
redis 采用 redis-3.2.4 版本. 安装过程 1. 下载并解压 cd /usr/local wget http://download.redis.io/releases/redis-3. ...
- storm集群搭建
安装环境: 虚拟操作系统:centOS7 64位 2台 IP地址为192.168.1.10 192.168.1.11 内存:1GB内存 zookeeper版本 :3.4.6 Storm版本:0. ...
- redis centos集群搭建和java应用
1. 首先要ssh免密登录 redis集群,3台虚拟机,6个节点,每台机器2个节点一主一从. 192.168.132.154 c0192.168.132.156 c1192.168.132.155 c ...
- redis集群搭建及java(jedis)链接
1.创建一个redis-cluster 目录 mkdir -p /usr/local/redis-cluster 创建6台redis服务器(单机下学习) mkdir 7001.mkdir 7002.m ...
- spark集群搭建(java)未完待续
环境 操作系统:windows10 虚拟机工具:VMware14.1 NUX版本:Centos7.2(64) JDK:1.8(64) 一.安装linux,master(桥接模式上网),slave(na ...
- 一:Storm集群环境搭建
第一:storm集群环境准备及部署[1]硬件环境准备--->机器数量>=3--->网卡>=1--->内存:尽可能大--->硬盘:无额外需求[2]软件环境准备---& ...
- Storm入门教程 第三章Storm集群安装部署步骤、storm开发环境
一. Storm集群组件 Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node).其分别对应的角色如下: 主控节点(Master Node)上运行一个被称为N ...
随机推荐
- 域名 端口 DNs 网络
netstat -an 查看所有 所有监听端口的使用情况
- Python之文件和异常IO
文件和异常 读写文本文件 读取文本文件时,需要在使用open函数时指定好带路径的文件名(可以使用相对路径或绝对路径)并将文件模式设置为'r'(如果不指定,默认值也是'r'),然后通过encoding参 ...
- HNUSTOJ-1696 简单验证码识别(模拟)
1696: 简单验证码识别 时间限制: 2 Sec 内存限制: 128 MB 提交: 148 解决: 44 [提交][状态][讨论版] 题目描述 验证码是Web系统中一种防止暴力破解的重要手段.其 ...
- python 模块导入import和import from区别
模块就是一个.py文件,在名字空间下导入模块导入import和import from,那么python 模块导入import和import from区别是什么呢 1,import 导入模块 impor ...
- 使用IP在局域网内访问System.Net.HttpListenerException:“拒绝访问。”
记录一下,自己写的程序之前运行没有遇到这个问题,突然遇到这个问题,找了一圈没有找到有效的解决方案,到最后发现,以管理员身份运行程序即可.简单记录一下. 还有就是 .UseUrls("http ...
- tcp 建立连接三次握手
众所周知,tcp是安全的,可靠的,但是为什么呢.要理解这一点,首先先了解tcp的建立连接的原理. 三次握手 第一次握手:由客户端向服务器发送请求,SYN 表示请求连接,seq是序列号(随机选取). 第 ...
- vue.js(10)--案例--列表增加与删除
品牌管理案例 (1)bootstrip快速布局 <div class="app"> <div class="panel panel-primary&qu ...
- load 和 initialize 的区别
官方文档 Apple的官方文档很清楚地说明了 initialize 和 load 的区别在于: load 是只要类所在文件被引用就会被调用,而 initialize 是在类或者其子类的第一个方法被调用 ...
- 线程屏障CyclicBarrier实现原理
生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...
- 2018-2-13-win10-uwp-读写csv-
title author date CreateTime categories win10 uwp 读写csv lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17 ...