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. AsMVC:一个简单的MVC框架的Java实现

    当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...

  2. 11-C#反射机制

    C#反射机制 转自:http://blog.csdn.net/educast/article/details/2894892 反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序 ...

  3. mysql sql语句分析

    1. SELECT     a.id    ,b.order_id,b.attr  FROM    tourist_order a     LEFT JOIN order_attr b     ON ...

  4. PHP对表单提交特殊字符的过滤和处理

    PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_str ...

  5. 结束指定Activity实例代码

    开通博客两个多月了,一直在看你们的文章 终于发觉伸手党真的很可耻.. 于是就随便写了个Demo来结束伸手党生涯~ Demo很简单:结束指定Activity... 不过也是我的一个小心意嘛.. 不要责怪 ...

  6. PL/SQL中文显示都显示成“?”的问题

    PL/SQL中文显示都显示成“?”的问题  首先我在sqlplus里面查询到的中文是正常的,然后再oracle里面的注册表里面看得nls_lang是SIMPLIFIED CHINESE_CHINA.Z ...

  7. Visual Studio 2013如何破解(密钥激活)

    其实有个方法最简单,就是点击“帮助”,选择注册产品,点击打开页面右下边的“使用秘钥注册产品”,输入上述秘钥即可.   在输入密钥界面,输入密钥“BWG7X-J98B3-W34RT-33B3R-JVYW ...

  8. 在iOS8下使用CLLocationManager定位服务需要系统授权

    最近在ios8.0使用CLLocationManager定位服务,发现老不能定位,查看设置菜单中的项也是处于未知状态.想起之前都有一个弹出框提示用户是否允许定位,这次一直没有出现了.原来ios8.0下 ...

  9. javascript之闭包深入理解(二)

    在上一节中,详细理解了作用域链和垃圾回收机制,似乎这两点跟闭包关系不大,但是仔细想一想就会发现,其实不然.这一节将通过上一部分的说明详细理解闭包.请看代码: function createCompar ...

  10. 企业管理系统开发笔记(4)---后台登录_MVC过滤器

    在asp.net时代,我们通常需要在后台的每个页面进行判断用户是否登录的状态,不管是通过session还是通过windows身份验证还是表单验证方式等等方法来对用户登录进行判断跳转.但是在mvc时代, ...