CentOS7搭建Storm集群及基础操作
前提
安装Kafka前需要先安装zookeeper集群,集体安装方法请参照我的另一篇文档
Storm安装
下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/storm/apache-storm-1.1.0/apache-storm-1.1.0.tar.gz
解压
tar -zxvf apache-storm-1.1.0.tar.gz
移动文件夹
mv apache-storm-1.1.0 /usr/local/hadoop/
vim storm.yaml
storm.zookeeper.servers:
- "192.168.174.200"
- "192.168.174.201"
nimbus.seeds: ["192.168.174.200"]
storm.local.dir: "/usr/local/hadoop/apache-storm-1.1.0/data"
- storm.zookeeper.servers:表示zookeeper的集群地址,如果Zookeeper集群使用的不是默认端口,那么还需要配置storm.zookeeper.port
- storm.zookeeper.port: Zookeeper集群的端口号
- storm.local.dir: 用于配置Storm存储少量文件的路径
- nimbus.seeds: 用于配置主控节点的地址,可以配置多个
拷贝文件到其余工作节点
scp apache-storm-1.1.0 salver1:/usr/local/hadoop/
Storm操作
启动主控节点
./storm nimbus 1>/dev/null 2>&1 &
启动主控节点管理界面
./storm ui 1>/dev/null 2>&1 &
启动工作节点
./storm supervisor 1>/dev/null 2>&1 &
访问地址
http://127.0.0.1:8080
运行拓扑
./storm jar storm-book.jar com.TopologyMain /usr/words.txt
删除拓扑
./storm kill Getting-Started-Toplogie
完整示例
package com;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.storm.Config;
import org.apache.storm.LocalCluster;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.AlreadyAliveException;
import org.apache.storm.generated.AuthorizationException;
import org.apache.storm.generated.InvalidTopologyException;
import org.apache.storm.kafka.KafkaSpout;
import org.apache.storm.kafka.SpoutConfig;
import org.apache.storm.kafka.StringScheme;
import org.apache.storm.kafka.ZkHosts;
import org.apache.storm.redis.bolt.RedisStoreBolt;
import org.apache.storm.redis.common.config.JedisPoolConfig;
import org.apache.storm.redis.common.mapper.RedisStoreMapper;
import org.apache.storm.spout.SchemeAsMultiScheme;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.tuple.Fields;
public class MykafkaSpout {
/**
* @param args
* @throws AuthorizationException
*/
public static void main(String[] args) throws AuthorizationException {
// TODO Auto-generated method stub
String host = "127.0.0.1";
int port = 6385;
String topic = "test" ;
ZkHosts zkHosts = new ZkHosts("192.168.174.200:2181,192.168.174.201:2181");
SpoutConfig spoutConfig = new SpoutConfig(zkHosts, topic,
"",
UUID.randomUUID().toString()) ;
List<String> zkServers = new ArrayList<String>() ;
zkServers.add("192.168.174.200");
zkServers.add("192.168.174.201");
spoutConfig.zkServers = zkServers;
spoutConfig.zkPort = 2181;
spoutConfig.socketTimeoutMs = 60 * 1000 ;
spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme()) ;
spoutConfig.startOffsetTime = kafka.api.OffsetRequest.LatestTime();
TopologyBuilder builder = new TopologyBuilder() ;
builder.setSpout("spout", new KafkaSpout(spoutConfig) ,1) ;
builder.setBolt("bolt1", new MyKafkaBolt(), 2).shuffleGrouping("spout") ;
builder.setBolt("MyCountBolt", new MyCountBolt(), 2).fieldsGrouping("bolt1", new Fields("type"));
// 将所有单词及其次数进行汇总输出
builder.setBolt("MyReportBolt", new MyReportBolt(), 2).globalGrouping("MyCountBolt");
JedisPoolConfig poolConfig = new JedisPoolConfig.Builder().setHost(host).setPort(port).setPassword("Apple05101314").build();
RedisStoreMapper storeMapper = new MyCountStoreMapper();
RedisStoreBolt storeBolt = new RedisStoreBolt(poolConfig, storeMapper);
//向redis保存数据
builder.setBolt("redis-store-bolt", storeBolt).globalGrouping("MyReportBolt");
Config conf = new Config ();
conf.setDebug(false) ;
if (args.length > 0) {
try {
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} catch (AlreadyAliveException e) {
e.printStackTrace();
} catch (InvalidTopologyException e) {
e.printStackTrace();
}
}else {
LocalCluster localCluster = new LocalCluster();
localCluster.submitTopology("mytopology", conf, builder.createTopology());
}
}
}
package com;
import java.util.HashMap;
import java.util.Map;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.IBasicBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
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;
public class MyKafkaBolt extends BaseRichBolt {
private OutputCollector outputCollector;
// key:messageId,Data
private HashMap<String, String> waitAck = new HashMap<String, String>();
public void prepare(Map map, TopologyContext context,
OutputCollector collector) {
// TODO Auto-generated method stub
this.outputCollector = collector;
}
public void execute(Tuple input) {
// TODO Auto-generated method stub
String kafkaMsg = input.getString(0);
if(kafkaMsg!=null){
this.outputCollector.emit(new Values(kafkaMsg));
this.outputCollector.ack(input);
}
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("type"));
}
}
package com;
import java.util.HashMap;
import java.util.Map;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.BasicOutputCollector;
import org.apache.storm.topology.IBasicBolt;
import org.apache.storm.topology.OutputFieldsDeclarer;
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;
public class MyCountBolt extends BaseRichBolt {
private OutputCollector outputCollector;
private HashMap<String, Integer> count;
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
// TODO Auto-generated method stub
this.outputCollector = collector;
this.count = new HashMap<String, Integer>();
}
public void execute(Tuple input) {
// TODO Auto-generated method stub
String type = input.getStringByField("type");
int cnt = 1;
if(count.containsKey(type)){
cnt = count.get(type) + 1;
}
count.put(type, cnt);
this.outputCollector.emit(new Values(type, cnt));
this.outputCollector.ack(input);
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
// TODO Auto-generated method stub
declarer.declare(new Fields("type", "cnt"));
}
}
package com;
import org.apache.storm.redis.common.mapper.RedisDataTypeDescription;
import org.apache.storm.redis.common.mapper.RedisStoreMapper;
import org.apache.storm.tuple.ITuple;
public class MyCountStoreMapper implements RedisStoreMapper {
private RedisDataTypeDescription description;
private final String hashKey = "myCount";
public MyCountStoreMapper() {
description = new RedisDataTypeDescription(
RedisDataTypeDescription.RedisDataType.HASH, hashKey);
}
public RedisDataTypeDescription getDataTypeDescription() {
return description;
}
public String getKeyFromTuple(ITuple tuple) {
return tuple.getStringByField("zs");
}
public String getValueFromTuple(ITuple tuple) {
return tuple.getIntegerByField("cnt")+"";
}
}
package com;
import org.apache.storm.redis.bolt.RedisStoreBolt;
import org.apache.storm.redis.common.config.JedisPoolConfig;
import org.apache.storm.redis.common.mapper.RedisStoreMapper;
import org.apache.storm.task.OutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.base.BaseRichBolt;
import org.apache.storm.tuple.Fields;
import org.apache.storm.tuple.Tuple;
import org.apache.storm.tuple.Values;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
/**
* Created by gzx on 17-2-6.
*/
public class MyReportBolt extends BaseRichBolt {
private static Logger logger = Logger.getLogger(MyReportBolt.class);
private OutputCollector outputCollector;
private HashMap<String, Integer> count;
public void prepare(Map map, TopologyContext topologyContext,
OutputCollector collector) {
this.count = new HashMap<String, Integer>();
this.outputCollector = collector;
}
/**
* 打印单词及其出现次数
*
* @param tuple
*/
public void execute(Tuple tuple) {
String type = tuple.getStringByField("type");
int cnt = tuple.getIntegerByField("cnt");
count.put(type, cnt);
if (count.containsKey("join") && count.containsKey("out")) {
int join = count.get("join");
int out = count.get("out");
int sy = join-out;
System.out.println("join=" + join);
System.out.println("out=" + out);
//System.out.printf("===当前剩余总数==="+sy+"\r\n");
logger.debug("===当前剩余总数==="+sy);
this.outputCollector.emit(new Values("zs", sy));
this.outputCollector.ack(tuple);
}
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("zs", "cnt"));
}
}
CentOS7搭建Storm集群及基础操作的更多相关文章
- centos7搭建kafka集群-第二篇
好了,本篇开始部署kafka集群 Zookeeper集群搭建 注:Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群(也可以用kafka自带的ZK,但不推荐) 1.软 ...
- 在CentOS上搭建Storm集群
Here's a summary of the steps for setting up a Storm cluster: Set up a Zookeeper clusterInstall depe ...
- centos7搭建kafka集群
一.安装jdk 1.下载jdk压缩包并移动到/usr/local目录 mv jdk-8u162-linux-x64.tar.gz /usr/local 2.解压 tar -zxvf jdk-8u162 ...
- CentOS7搭建Hadoop2.8.0集群及基础操作与测试
环境说明 示例环境 主机名 IP 角色 系统版本 数据目录 Hadoop版本 master 192.168.174.200 nameNode CentOS Linux release 7.4.1708 ...
- Centos7搭建zookeeper集群
centos7与之前的版本都不一样,修改主机名在/ect/hostname 和/ect/hosts 这两个文件控制 首先修改/ect/hostname vi /ect/hostname 打开之后的内容 ...
- 【转】centos7 搭建etcd集群
转自http://www.cnblogs.com/zhenyuyaodidiao/p/6237019.html 一.简介 “A highly-available key value store for ...
- 初学Hadoop:利用VMWare+CentOS7搭建Hadoop集群
一.前言 开始学习数据处理相关的知识了,第一步是搭建一个Hadoop集群.搭建一个分布式集群需要多台电脑,在此我选择采用VMWare+CentOS7搭建一个三台虚拟机组成的Hadoop集群. 注:1 ...
- centos7搭建kafka集群-第一篇
Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位 我想对用户 ...
- centos7搭建dolphinscheduler集群
一.简述 Apache DolphinScheduler是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统.致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用.有 ...
随机推荐
- Wannafly挑战赛16 #E 弹球弹弹弹 splay+基环树+各种思维
链接:https://ac.nowcoder.com/acm/problem/16033来源:牛客网 有n个位置,标号为1到n的整数,m次操作,第i次操作放置一个弹球在b[i] xor c[i-1]处 ...
- MongoDB可视化工具的安装
MongoDBCompass MongoDB Compass是一款优秀可靠的mongodb可视化数据库管理软件.可以更加方便地与mongodb数据库进行交互,支持对数据库进行查询.分析或者查看数据库的 ...
- CSS中clip-path属性的使用
clip-path的使用 polygon 值为多个坐标点组成,坐标第一个值是x方向,第二个值是y方向. 左上角为原点,右下角是(100%,100%)的点.</p> body { backg ...
- jQuery插件simplePagination的使用-踩坑记_03
jQuery插件simplePagination的使用 正在熟悉项目上的代码,新添加了一个需要,需要对表单进行分页,之前的代码中是有分页的代码的,看了老半天,也没看太明白.之前的项目比较久远,继续熟悉 ...
- DB数据库的基本操作
启动 MongoDB 服务 sudo service mongodb start 进入 MongoDB 命令行操作界面,在命令行中敲 exit 可以退出.mongo 创建数据库 use db 命令查看 ...
- Linux shell - ps,wc命令用法
例1. 查看Oracle数据库活动进程LOCAL=NO,输出行数 oracle@sha> ps -ef|grep LOCAL=NO|wc -l 15 解释:ps -ef是查看所有的进程的 然后用 ...
- 移动端轮播完整版css3加原生写法
<!doctype html><html><head> <meta charset="UTF-8"> <meta name=& ...
- 用 MuGo 搭建 Go Engine 在 KGS 对战
MuGo 是一个开源的 Go Engine,下棋能力大概在 10k - 2k 左右. 用 MuGo 搭建 Go Engine 并在 KGS 对战的步骤如下: 1. 安装 TensorFlow 因为 M ...
- 用Vue来实现购物车功能(二)
这个小demo具有添加商品进购物车 .增加购物车内商品的数量.减少购物车内商品的数量.计算一类商品的总价.以及计算所有商品的总价 首先看目录结构 因为我们的Tab.vue Car.vue 以及Car ...
- MongoDB 基本命令备忘
使用admin数据库: use admin 显示数据库: show dbs 创建用户,并制定该用户的角色: db.createUser({user: "root",pwd:&quo ...