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 ...
随机推荐
- lambda表达式(c++11)
1.概念 1)lambda表达式是一个可调用的代码单元,它由一个捕获列表.一个参数列表.一个箭头.一个返回类型.一个函数体组成: 2)可以忽略参数列表和返回类型,但必须包含捕获列表和函数体: 3)忽略 ...
- HDU 5212 Code (莫比乌斯反演)
题意:给定上一个数组,求 析: 其中,f(d)表示的是gcd==d的个数,然后用莫比乌斯反演即可求得,len[i]表示能整队 i 的个数,可以线性筛选得到, 代码如下: #pragma comment ...
- 安卓 build/core/Makefile 以及main.mk
android make 系统总共分为四层 arch board device product 在各个字android.mk文件中引用的定义都存放在./build/core/下!比如android.m ...
- 第82讲:Scala中List的ListBuffer是如何实现高效的遍历计算的?
今天学习下list中的ListBuffer实现的高效计算.让我们先来看下代码 def main(args:Array[String]){ val list = List(1,2,3,4, ...
- 一篇谈Flink不错的文章
精华 : 在执行引擎这一层,流处理系统与批处理系统最大不同在于节点间的数据传输方式.对于一个流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一 ...
- 转:Ubuntu 10.10 安装后上不了网的原因
最近新装了个Ubuntu10.10 发现上不了网,折腾了很久,在网上找了很多办法都不行,最后试了一招居然管用了.特此总结下Ubuntu了网的原因及对策分析. 环境:Ubuntu 10.10网络: 通过 ...
- double float的精度问题
三部曲 1: #include <iostream> #include <stdio.h> #include <string.h> using namespace ...
- PL/SQL客户端连Oracle很快就断开问题的解决
PL/SQL登录很短时间session就自动断开 1.首先查看你这个用户的profile文件 select profile from dba_users where username='USERNAM ...
- Android-Failed to open zip file
当AndroidStudio加载工程的时候,出现以下错误❌: 解决前的工程目录: 1.将以上错误认真的分析: 2.找到工程的 gradle文件夹/wrapper文件夹/gradle-wrapper.p ...
- C#导入Excel数据常见问题
今天在做一个excle数据导入的时候遇到了一个奇葩问题,项目使用的是MVC,在VS2010里面调试的时候没有问题,可是当发布到本地IIS或服务器上时就出现了问题: 1.excel文件正在被使用: 2. ...