Strom的trident单词计数代码
/**
* 单词计数
*/
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单词计数代码的更多相关文章
- Storm官方提供的trident单词计数的例子
上代码: public class TridentWordCount { public static class Split extends BaseFunction { @Override publ ...
- Strom实现单词统计代码
import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashM ...
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
一:自定义实现InputFormat *数据源来自于内存 *1.InputFormat是用于处理各种数据源的,下面是实现InputFormat,数据源是来自于内存. *1.1 在程序的job.setI ...
- storm(5)-分布式单词计数例子
例子需求: spout:向后端发送{"sentence":"my dog has fleas"}.一般要连数据源,此处简化写死了. 语句分割bolt(Split ...
- MapReduce之单词计数
最近在看google那篇经典的MapReduce论文,中文版可以参考孟岩推荐的 mapreduce 中文版 中文翻译 论文中提到,MapReduce的编程模型就是: 计算利用一个输入key/value ...
- hadoop笔记之MapReduce的应用案例(WordCount单词计数)
MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...
- 第一章 flex单词计数程序
学习Flex&Bison目标, 读懂SQLite中SQL解析部分代码 Flex&Bison简介Flex做词法分析Bison做语法分析 第一个Flex程序, wc.fl, 单词计数程序 ...
- 大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)
前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分 ...
- Storm实现单词统计代码
import java.io.File; import java.io.IOException; import java.util.Collection; import java.util.HashM ...
随机推荐
- MFC连接MySQL C API方法
1.首先下载一个32位的MySQL,因为vc的版本是32位了,不用32 位的MySQL会出现无效的机械码错误. MySQL安装地址:https://dev.mysql.com/downloads/my ...
- 学习devexpresschartControl控件
devexpress官网chart:https://documentation.devexpress.com/WindowsForms/8117/Controls-and-Libraries/Char ...
- centos6上安装jenkins
一.安装jdk 1.下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...
- C#的委托与Java的自定义接口的异曲同工的同步操作
C#的委托(以WinForm为例) 在子窗体(ChildFrm)中定义一个委托 this.CaptureListener(callback);//子窗体触发委托事件,以告诉调用的窗体 /// < ...
- AngularJS实战之路由ui-view
1. 路由(ui-router) 1.1. 环境 1) angular.min.js 2) angular-ui-router-0.2.10.js 3) 确保确保包含ui.router为模块依赖关系. ...
- 20155205 2016-2017-2 《Java程序设计》第3周学习总结
20155205 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 定义类的两种方法(new和this的用法) 只要有一个类定义,编译程序就会产生一个. ...
- 【2】C#读取文本文件
一.读取
- How to resolve "your security settings have blocked an untrusted application from running" in Mac
If you encounter the error "your security settings have blocked an untrusted application from r ...
- kepware http接口 c语言(libcrul)开发
列出所有变量 CURL *hnd = curl_easy_init(); curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "GET"); ...
- 20155326 《Java程序设计》第8周学习总结
20155326 <Java程序设计>第8周学习总结 教材学习内容总结 NIO (1)NIO使用频道来衔接数据节点,在处理数据时,NIO可以让你设定缓冲区容量,在缓冲区中对感兴趣的数据区块 ...