package com.mengyao.storm;

 import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import org.apache.commons.io.FileUtils; 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.spout.SpoutOutputCollector;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import backtype.storm.utils.Utils; /**
* Storm中的单词计数,拓扑结构为InputSpout->SplitBolt->CountBolt = WordCountTopology
* @author mengyao
*
*/
@SuppressWarnings("all")
public class WordCountTopology { public static class InputSpout extends BaseRichSpout{ private Map conf;
private TopologyContext context;
private SpoutOutputCollector collector; /**
* 实例化该Spout时预处理,仅会被调用一次,类似于MapReduce中Mapper/Reducer的setup()方法
*/
@Override
public void open(Map conf, TopologyContext context,
SpoutOutputCollector collector) {
this.conf = conf;
this.context = context;
this.collector = collector;
} /**
* 死循环发射每行消息
*/
@Override
public void nextTuple() {
Collection<File> listFiles = FileUtils.listFiles(new File("D:/"), new String[]{"log"}, false);
for (File file : listFiles) {
try {
List<String> lines = FileUtils.readLines(file);
for (String line : lines) {
this.collector.emit(new Values(line));
System.err.println("==== InputSpout:"+line+" ====");
}
FileUtils.moveFile(file, new File(file.getAbsoluteFile()+".tmp"));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
} /**
* 声明字段“line”提供给下一个Bolt组件订阅
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("line"));
} } public static class SplitBolt extends BaseRichBolt{ private Map stormConf;
private TopologyContext context;
private OutputCollector collector; /**
* 实例化该Bolt时预处理,仅会被调用一次,类似于MapReduce中Mapper/Reducer的setup()方法
*/
@Override
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
this.stormConf = stormConf;
this.context = context;
this.collector = collector;
} /**
* 死循环发送每个单词
*/
@Override
public void execute(Tuple input) {
String line = input.getStringByField("line");
String[] words = line.split("\t");
for (String word : words) {
this.collector.emit(new Values(word));
System.err.println("==== SplitBolt:"+word+" ====");
}
} /**
* 声明字段“word”提供给下一个Bolt组件订阅
*/
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("word"));
} } public static class CountBolt extends BaseRichBolt{ private Map stormConf;
private TopologyContext context;
private OutputCollector collector;
HashMap<String, Long> map = new HashMap<String, Long>(); /**
* 实例化该Bolt时预处理,仅会被调用一次,类似于MapReduce中Mapper/Reducer的setup()方法
*/
@Override
public void prepare(Map stormConf, TopologyContext context,
OutputCollector collector) {
this.stormConf = stormConf;
this.context = context;
this.collector = collector;
} @Override
public void execute(Tuple input) {
String word = input.getStringByField("word");
Long value = map.get(word);
if (value==null) {
value=0L;
}
value++;
map.put(word, value);
for (Entry<String, Long> entry : map.entrySet()) {
System.err.println("==== CountBolt:"+entry+" ====");
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
} } public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException {
String topologyName = WordCountTopology.class.getSimpleName();
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("input", new InputSpout());
builder.setBolt("split", new SplitBolt()).shuffleGrouping("input");
builder.setBolt("count", new CountBolt()).shuffleGrouping("split"); Config config = new Config();
config.setDebug(true); if (args!=null && args.length>0) { //如果是生产环境中使用集群模式提交拓扑
config.setNumWorkers(3);
StormSubmitter.submitTopology(topologyName, config, builder.createTopology());
} else {      //否则使用本地模式提交拓扑
LocalCluster cluster = new LocalCluster();
cluster.submitTopology(topologyName, config, builder.createTopology());
Utils.sleep(1000*100);
cluster.killTopology(topologyName);
cluster.shutdown();
} }
} 依赖的jar包如下图:

Storm实现单词计数的更多相关文章

  1. 大数据学习——Storm学习单词计数案例

    需求:计算单词在文档中出现的次数,每出现一次就累加一次 遇到的问题 这个问题是<scope>provided</scope>作用域问题 https://www.cnblogs. ...

  2. storm(5)-分布式单词计数例子

    例子需求: spout:向后端发送{"sentence":"my dog has fleas"}.一般要连数据源,此处简化写死了. 语句分割bolt(Split ...

  3. 【Storm】storm安装、配置、使用以及Storm单词计数程序的实例分析

    前言:阅读笔记 storm和hadoop集群非常像.hadoop执行mr.storm执行topologies. mr和topologies最关键的不同点是:mr执行终于会结束,而topologies永 ...

  4. Storm实现单词统计代码

    import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashM ...

  5. 使用Scala实现Java项目的单词计数:串行及Actor版本

    其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...

  6. MapReduce之单词计数

    最近在看google那篇经典的MapReduce论文,中文版可以参考孟岩推荐的 mapreduce 中文版 中文翻译 论文中提到,MapReduce的编程模型就是: 计算利用一个输入key/value ...

  7. 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子

    一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ...

  8. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  9. 第一章 flex单词计数程序

    学习Flex&Bison目标, 读懂SQLite中SQL解析部分代码 Flex&Bison简介Flex做词法分析Bison做语法分析 第一个Flex程序, wc.fl, 单词计数程序 ...

随机推荐

  1. 几个常用的ps命令

    1. ps aux If you are looking for a short summary of the active processes, use  ps aux [root@rhel7 tm ...

  2. ServletContextListener 解析用法

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  3. Freemarker常用技巧(二)

    1 list.break指令<#list sequence as item>  ...</#list>tem_index:当前变量的索引值.item_has_next:是否存在 ...

  4. 根据goodsId获得相关商品的列表

    List<Goods> goodsList = goodsDetailService.getGoodsListByproductId(productId); for (Goods good ...

  5. JavaScript 浮点数运算 精度问题

    JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本. //加减 <script type="text/javascript" lan ...

  6. JavaScript: 世界上最被误解的语言|Douglas Crockford

    JavaScript: 世界上最被误解的语言 JavaScript: The Wrrrld's Most Misunderstood Programming Language Douglas Croc ...

  7. Activity的学习

    安卓的四大组件分别是 Activity ,Service服务, BroadcastReceiver广播接收器,ContentProvide内容提供器 . Activity: Activity是应用程序 ...

  8. eclipse中的web-inf下没有web.xml

  9. Skin++ 皮肤库 CCheckListBox MFC 界面风格

    今天使用CCheckListBox,发现增加进去的字符串无法显示,但是当点击的时候,确有反应. 仔细检查代码,没有问题.之前也是这样用的,完全没有问题. 思前想后,觉得是因为使用了Skin++皮肤库, ...

  10. 关于C++中的虚拟继承的一些总结

    1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念.虚拟基类是为解决多重继承而出现的.如:类D继承自类B1.B2,而类B1.B2都继承自类A,因此在类D中两次出现类A中的变量和函数.为了节省内存 ...