/**
* 单词计数
*/
public class LocalTridentCount { public static class MyBatchSpout implements IBatchSpout { Fields fields;
HashMap<Long, List<List<Object>>> batches = new HashMap<Long, List<List<Object>>>(); public MyBatchSpout(Fields fields) {
this.fields = fields;
}
@Override
public void open(Map conf, TopologyContext context) {
} @Override
public void emitBatch(long batchId, TridentCollector collector) {
List<List<Object>> batch = this.batches.get(batchId);
if(batch == null){
batch = new ArrayList<List<Object>>();
Collection<File> listFiles = FileUtils.listFiles(new File("d:\\stormtest"), new String[]{"txt"}, true);
for (File file : listFiles) {
List<String> readLines;
try {
readLines = FileUtils.readLines(file);
for (String line : readLines) {
batch.add(new Values(line));
}
FileUtils.moveFile(file, new File(file.getAbsolutePath()+System.currentTimeMillis()));
} catch (IOException e) {
e.printStackTrace();
} }
if(batch.size()>0){
this.batches.put(batchId, batch);
}
}
for(List<Object> list : batch){
collector.emit(list);
}
} @Override
public void ack(long batchId) {
this.batches.remove(batchId);
} @Override
public void close() {
} @Override
public Map getComponentConfiguration() {
Config conf = new Config();
conf.setMaxTaskParallelism(1);
return conf;
} @Override
public Fields getOutputFields() {
return fields;
} } /**
* 对一行行的数据进行切割成一个个单词
*/
public static class MySplit extends BaseFunction{ @Override
public void execute(TridentTuple tuple, TridentCollector collector) {
String line = tuple.getStringByField("lines");
String[] words = line.split("\t");
for (String word : words) {
collector.emit(new Values(word));
}
} } public static class MyWordAgge extends BaseAggregator<Map<String, Integer>>{ @Override
public Map<String, Integer> init(Object batchId,
TridentCollector collector) {
return new HashMap<String, Integer>();
} @Override
public void aggregate(Map<String, Integer> val, TridentTuple tuple,
TridentCollector collector) {
String key = tuple.getString(0);
/*Integer integer = val.get(key);
if(integer==null){
integer=0;
}
integer++;
val.put(key, integer);*/
val.put(key, MapUtils.getInteger(val, key, 0)+1);
} @Override
public void complete(Map<String, Integer> val,
TridentCollector collector) {
collector.emit(new Values(val));
} } /**
* 汇总局部的map,并且打印结果
*
*/
public static class MyCountPrint extends BaseFunction{ HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
@Override
public void execute(TridentTuple tuple, TridentCollector collector) {
Map<String, Integer> map = (Map<String, Integer>)tuple.get(0);
for (Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
Integer integer = hashMap.get(key);
if(integer==null){
integer=0;
}
hashMap.put(key, integer+value);
} Utils.sleep(1000);
System.out.println("==================================");
for (Entry<String, Integer> entry : hashMap.entrySet()) {
System.out.println(entry);
}
} } public static void main(String[] args) {
//大体流程:首先设置一个数据源MyBatchSpout,会监控指定目录下文件的变化,当发现有新文件的时候把文件中的数据取出来,
//然后封装到一个batch中发射出来.就会对tuple中的数据进行处理,把每个tuple中的数据都取出来,然后切割..切割成一个个的单词.
//单词发射出来之后,会对单词进行分组,会对一批假设有10个tuple,会对这10个tuple分完词之后的单词进行分组, 相同的单词分一块
//分完之后聚合 把相同的单词使用同一个聚合器聚合 然后出结果 每个单词出现多少次...
//进行汇总 先每一批数据局部汇总 最后全局汇总....
//这个代码也不是很简单...挺多....就是使用批处理的方式. TridentTopology tridentTopology = new TridentTopology(); tridentTopology.newStream("spoutid", new MyBatchSpout(new Fields("lines")))
.each(new Fields("lines"), new MySplit(), new Fields("word"))
.groupBy(new Fields("word"))//用到了分组 对一批tuple中的单词进行分组..
.aggregate(new Fields("word"), new MyWordAgge(), new Fields("wwwww"))//用到了聚合
.each(new Fields("wwwww"), new MyCountPrint(), new Fields("")); LocalCluster localCluster = new LocalCluster();
String simpleName = TridentMeger.class.getSimpleName();
localCluster.submitTopology(simpleName, new Config(), tridentTopology.build());
}
}

指定路径下文件中的内容:

程序运行结果:

Strom的trident单词计数代码的更多相关文章

  1. Storm官方提供的trident单词计数的例子

    上代码: public class TridentWordCount { public static class Split extends BaseFunction { @Override publ ...

  2. Strom实现单词统计代码

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

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

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

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

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

  5. MapReduce之单词计数

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

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

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

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

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

  8. 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

       前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...

  9. Storm实现单词统计代码

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

随机推荐

  1. ibatis注意要点

    一.ibatis的关键字like查询 select * from t_student where s_name '%张%'; 这种like语句在ibatis中怎么写,他们现在的项目是用ibatis作为 ...

  2. highChart图表

    Highcharts 是一个用纯JavaScript编写的一个图表库, 能够很简单便捷的在web网站或是web应用程序添加有交互性的图表,并且免费提供给个人学习.个人网站和非商业用途使用.HighCh ...

  3. HTTP 错误 500.XX - Internal Server Error 解决办法

    HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. 详细错误信息 模块 IIS Web Core 通知 未知 处理程序 尚未 ...

  4. 何时使用Delegate或接口

    在以下情况下使用Delegates很有用: 调用一个单一方法: 一个类要进行方法规范(method specification)的多种执行: 使用一个静态方法来执行规范: 想获得类似事件设计的模式: ...

  5. linux下运算的几种方法

    1.expr 1.1 最简单的用法 yan@yan:~$ \* yan@yan:~$ 1.2 bash脚本对于expr yan@yan:~$ cat expr1.sh #!/bin/bash PATH ...

  6. 基于MySQL自增ID字段增量扫描研究

    目录 目录 1 1. 问题 1 2. 背景 1 3. InnoDB表 2 3.1. 自增ID为主键 2 3.2. 自增ID为普通索引 4 3.3. 原因分析 7 4. MyISAM表 8 4.1. 自 ...

  7. spring注解开发

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...

  8. day37(类加载器)

    类的加载器:将class文件加载到JVM中执行这个文件. Java中将类加载器分成三类: 引导类加载器:     JAVA_HOME/jre/lib/rt.jar | 扩展类加载器:     JAVA ...

  9. How to fix "http error 403.14 - forbidden" in IIS7

    If you encounter the following error: "http error 403.14 - forbidden. The Web server is configu ...

  10. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...