strom:实时的WordCount
集采单词
package wordcount; import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map; import org.apache.commons.io.FileUtils; 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; /**
* @ClassName: DataSourceSpout
* @Description: TODO
* @author cheng
* @date 2017年12月12日 下午2:06:32
*收集数据源
*/
public class DataSourceSpout extends BaseRichSpout{
private Map conf;
private TopologyContext context;
private SpoutOutputCollector collector; /* (non-Javadoc)
* 运行时调用一次,初始化
* conf获取配置参数,
* collector:spout收集数据发送给blot
*/
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector=collector;
this.conf=conf;
this.context=context;
}
// 读文件
public void nextTuple() {
// 参数:目录位置,文件后缀,是否递归
Collection<File> files = FileUtils.listFiles(new File("F:/安装/java工程/StormTest/data"),
new String[]{"txt"},true);
// Collection<File> files = FileUtils.listFiles(new File("/home/neworigin/Desktop/data"),
// new String[]{"txt"},true);
// 遍历文件内容
for(File file:files)
{
//按行来读
try {
// 将读取的每行存放在List中
List<String> lines = FileUtils.readLines(file);
// 把一行数据发送出去
for(String line:lines)
{
this.collector.emit(new Values(line));
}
Thread.sleep(1000);
// 防止文件被重复读,将读过的文件改名
FileUtils.moveFile(file, new File(file.getAbsolutePath()+System.currentTimeMillis()));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//声明输出的内容,告知blot,spout输出的内容
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));//通过字段名称来获取字段内容
}
@Override
public void close() {
System.out.println("read close");
} }
处理单词(按空格拆分)
package wordcount; import java.util.Map; import backtype.storm.spout.SpoutOutputCollector;
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; /**
* @ClassName: SplitBolt
* @Description: TODO
* @author cheng
* @date 2017年12月12日 下午2:28:25
*切分采集的数据
*/
public class SplitBolt extends BaseRichBolt{
private Map conf;
private TopologyContext context;
private OutputCollector collector;
//调用一次,进行初始化
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
this.collector=collector;
this.context=context;
this.conf=conf;
}
// 处理数据
public void execute(Tuple input) {
// 根据字段获取每一行数据
String line=input.getStringByField("line");
String[] words = line.split(" ");
for(String word:words )
{
//传递给下一个bolt
this.collector.emit(new Values(word));
}
}
//声明输出的内容,告知下一个bolt这里输出的是什么
// 如果是最后一个bolt就不用声明字段名称
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("words"));
} }
对单词计数
package wordcount; import java.util.HashMap;
import java.util.Map; 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; public class CountBolt extends BaseRichBolt{
private Map conf;
private TopologyContext context;
private OutputCollector collector;
//调用一次,进行初始化
public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
this.collector=collector;
this.context=context;
this.conf=conf;
}
int testnum=0;
int i=0;
HashMap<String,Integer> hashmap=new HashMap<String,Integer>();
public void execute(Tuple input) {
// 获取每一个单词
String word = input.getStringByField("words");
// 对所有单词进行汇总
Integer num = hashmap.get(word);//根据key来获取value
if(num==null)
{
num=0;
}
num++;
hashmap.put(word, num);
// System.out.println("---------"+testnum++);
// 遍历map,输出键值对
System.out.println("执行countBolt的exec"+i++);
for(Map.Entry<String, Integer> entry:hashmap.entrySet())
{
System.out.println("word="+entry.getKey()+":number="+entry.getValue()+"---------"+testnum++); } }
//最后一个bolt,不用声明
public void declareOutputFields(OutputFieldsDeclarer declarer) { } }
联合运行
package wordcount; import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.BoltDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import clojure.main; public class WordCount {
public static void main(String[] args) throws InterruptedException, AlreadyAliveException, InvalidTopologyException {
TopologyBuilder builder=new TopologyBuilder();
builder.setSpout("spout_id", new DataSourceSpout(),4);//默认只有一个,给个4设置并发度(多线程执行),还以在最后面设置numtask(task的数量,默认每个executor执行已task)
builder.setBolt("bolt_1", new SplitBolt()).shuffleGrouping("spout_id");//因为有多个bolt需要指定上一个步骤
BoltDeclarer declarer = builder.setBolt("bolt_2", new CountBolt()).fieldsGrouping("bolt_1",new Fields("words"));//指定上一个bolt并按words相同的bolt分到同一个task
// 设置在本地运行
LocalCluster cluster = new LocalCluster();
Config config = new Config();
config.setNumWorkers(2);//设置worker的数量
cluster.submitTopology("topology", config, builder.createTopology());
}
}
strom:实时的WordCount的更多相关文章
- Spark练习之通过Spark Streaming实时计算wordcount程序
Spark练习之通过Spark Streaming实时计算wordcount程序 Java版本 Scala版本 pom.xml Java版本 import org.apache.spark.Spark ...
- 50、Spark Streaming实时wordcount程序开发
一.java版本 package cn.spark.study.streaming; import java.util.Arrays; import org.apache.spark.SparkCon ...
- Flink简介及使用
一.Flink概述 官网:https://flink.apache.org/ mapreduce-->maxcompute HBase-->部门 quickBI DataV Hive--& ...
- Flink+kafka实现Wordcount实时计算
1. Flink Flink介绍: Flink 是一个针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.目前主要还是依靠开源社区的贡献而发展.对 Flink 而言,其所要处理的主要场 ...
- 55、Spark Streaming:updateStateByKey以及基于缓存的实时wordcount程序
一.updateStateByKey 1.概述 SparkStreaming 7*24 小时不间断的运行,有时需要管理一些状态,比如wordCount,每个batch的数据不是独立的而是需要累加的,这 ...
- 52、Spark Streaming之输入DStream之基础数据源以及基于HDFS的实时wordcount程序
一.概述 1.Socket:之前的wordcount例子,已经演示过了,StreamingContext.socketTextStream() 2.HDFS文件 基于HDFS文件的实时计算,其实就是, ...
- 输入DStream之基础数据源以及基于HDFS的实时wordcount程序
输入DStream之基础数据源以及基于HDFS的实时wordcount程序 一.Java方式 二.Scala方式 基于HDFS文件的实时计算,其实就是,监控一个HDFS目录,只要其中有新文件出现,就实 ...
- 开源分布式实时计算引擎 Iveely Computing 之 WordCount 详解(3)
WordCount是很多分布式计算中,最常用的例子,例如Hadoop.Storm,Iveely Computing也不例外.明白了WordCount在Iveely Computing上的运行原理,就很 ...
- Hadoop平台提供离线数据和Storm平台提供实时数据流
1.准备工作 2.一个Storm集群的基本组件 3.Topologies 4.Stream 5.数据模型(Data Model) 6.一个简单的Topology 7.流分组策略(Stream grou ...
随机推荐
- Shiro学习笔记(二)
首先还是先搭建工程运行环境 依旧搭建的是Maven工程,如果不是Maven 也可以去网上找jar包然后导入 (我使用Maven主要是找依赖配置文件就行,我自己导jar包的时候就是很容易报错) 还是先 ...
- Katana的WebAPI集成Swagger 解决方案
这位大哥写的博客很清楚了,我就不重复了. http://www.cnblogs.com/caodaiming/p/4156476.html 错误解决 http://blog.csdn.net/gold ...
- Gym 100247B Similar Strings(哈希+思维)
https://vjudge.net/problem/Gym-100247B 题意: 如果两个字符串通过映射后是一样的,则说明这两个字符串是相似的,现在给出n个字符串,计算出有多少组字符串是相似的. ...
- Go 灵活多变的切片Slice
我们知道数组定义好之后其长度就无法再修改,但是,在实际开发过程中,有时候我们并不知道需要多大的数组,我们期望数组的长度是可变的, 在 Go 中有一种数据结构切片(Slice) 解决了这个问题,它是可变 ...
- 正则解析json数据
http://tool.chinaz.com/regex http://tool.oschina.net/regex/
- arcgis 要素服务增删改查
两种方式: 第一种 要素服务的增删改操作,在ArcGIS API for JS中给我们提供了三个类用于要素的增Add,删Delete,改Update 添加draw和要素服务 //用于操作的要素图层,注 ...
- P1182 数列分段`Section II`
传送门 思路: 求数列每段和的最大值的最小值,很明显是用二分法求解,加贪心检验.本题关键是要怎么去高效的check,可以考虑一个贪心的思路,能加的就加上,不能则新开一段,so对于二分的值 u ,我们从 ...
- EF延迟加载和懒加载
EF默认是延迟加载的 延迟加载就是刚开始只会读取当前实体对应表的数据 关联表的数据不会读取 只有下面条件用到了才会再去读取 所以可能会造成N次读取数据库 需要在实体的属性加virtual关键字 延迟 ...
- display: none; 与 jq show方法之间的联系
1. 定义四种常用隐藏元素的方式,然后调用 jq 的 show 方法显示,观察各原先隐藏元素的 display 表现,结合 jq 源码,show 方法设置 元素 display 属性值为 ...
- ubuntu 配置sublime text3
1安装st3(http://blog.csdn.net/zhaoyu106/article/details/52858962) sudo apt-get update sudo apt-get ins ...