storm经典例子的wordcount的实现

storm有个经典的例子wordcount,其实这几乎可以说是大数据的经典例子了,mapreduce也会有这个例子。但是storm给的例子包里的WordCountTopology用到了python的调用,直接用eclipse跑起来的话会报错,这里做了个小改动。

1、WordCountTopology.java

package storm.starter;

import backtype.storm.Config;

import backtype.storm.LocalCluster;

import backtype.storm.StormSubmitter;

import backtype.storm.task.ShellBolt;

import backtype.storm.topology.BasicOutputCollector;

import backtype.storm.topology.FailedException;

import backtype.storm.topology.IRichBolt;

import backtype.storm.topology.OutputFieldsDeclarer;

import backtype.storm.topology.TopologyBuilder;

import backtype.storm.topology.base.BaseBasicBolt;

import backtype.storm.tuple.Fields;

import backtype.storm.tuple.Tuple;

import backtype.storm.tuple.Values;

import storm.starter.spout.RandomSentenceSpout;

import java.util.HashMap;

import java.util.Map;

/**

* This topology demonstrates Storm‘s stream groupings and multilang capabilities.

*/

public class WordCountTopology {

//  public static class SplitSentence extends ShellBolt implements IRichBolt {

//

//    public SplitSentence() {

//      super("python", "splitsentence.py");

//    }

//

//    @Override

//    public void declareOutputFields(OutputFieldsDeclarer declarer) {

//      declarer.declare(new Fields("word"));

//    }

//

//    @Override

//    public Map<String, Object> getComponentConfiguration() {

//      return null;

//    }

//  }

public static class SplitSentence extends BaseBasicBolt {

String patton ;

public SplitSentence(String patton) {

this.patton = patton;

}

@Override

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("word"));

}

@Override

public void execute(Tuple tuple, BasicOutputCollector collector) {

try {

String sen = tuple.getString(0);

if(sen != null)

{

for(String word : sen.split(patton))

{

collector.emit(new Values(word));

}

}

} catch (Exception e) {

throw new FailedException("split fail!");

}

}

}

public static class WordCount extends BaseBasicBolt {

Map<String, Integer> counts = new HashMap<String, Integer>();

@Override

public void execute(Tuple tuple, BasicOutputCollector collector) {

//      String word = tuple.getString(0);

String word = tuple.getStringByField("word");

Integer count = counts.get(word);

if (count == null)

count = 0;

count++;

counts.put(word, count);

//     collector.emit(new Values(word, count));

System.err.println("word="+word+";  word_count="+count);

}

@Override

public void declareOutputFields(OutputFieldsDeclarer declarer) {

//     declarer.declare(new Fields("word", "count"));

}

}

public static void main(String[] args) throws Exception {

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout("spout", new RandomSentenceSpout(), 1);

builder.setBolt("split", new SplitSentence(" "), 1)

.shuffleGrouping("spout");

builder.setBolt("count", new WordCount(), 1)

.fieldsGrouping("split", new Fields("word"));

Config conf = new Config();

conf.setDebug(false);

if (args != null && args.length > 0) {

conf.setNumWorkers(3);

StormSubmitter.submitTopology(args[0], conf, builder.createTopology());

}

else {

conf.setMaxTaskParallelism(3);

LocalCluster cluster = new LocalCluster();

cluster.submitTopology("word-count", conf, builder.createTopology());

Thread.sleep(5000);

cluster.shutdown();

}

}

}

2、spout的实现类RandomSentenceSpout.java

package storm.starter.spout;

import backtype.storm.spout.SpoutOutputCollector;

import backtype.storm.task.TopologyContext;

import backtype.storm.topology.OutputFieldsDeclarer;

import backtype.storm.topology.base.BaseRichSpout;

import backtype.storm.tuple.Fields;

import backtype.storm.tuple.Values;

import backtype.storm.utils.Utils;

import java.util.Map;

import java.util.Random;

public class RandomSentenceSpout extends BaseRichSpout {

SpoutOutputCollector _collector;

Random _rand;

int _num;

@Override

public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {

_collector = collector;

_rand = new Random();

}

@Override

public void nextTuple() {

Utils.sleep(100);

String[] sentences = new String[]{ "the cow jumped over the moon", "an apple a day keeps the doctor away",

"four score and seven years ago", "snow white and the seven dwarfs", "i am at two with nature" };

int num = _rand.nextInt(sentences.length);

String sentence = sentences[num];

_num++;

System.err.println("Spout__batch_num:"+_num+"___Random number is :"+num+" Emit Sentence is :"+sentence);

_collector.emit(new Values(sentence));

}

@Override

public void ack(Object id) {

}

@Override

public void fail(Object id) {

}

@Override

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("word"));

}

}

3、bolt的实现类嵌套在topo类里。

时间: 2024-10-21 10:51:47

storm经典例子的wordcount的实现的相关文章

递归的几个经典例子

注意:构造方法不可递归,否则是无限创建对象; 递归的几个经典例子: 1.HannoiTower 1 import java.util.Scanner; 2 public class HanoiTower{ 3 //level代表盘子个数;三个char类型代表柱子 4 public static void moveDish(int level, char from, char inter, char to){ 5 if(level == 1){ 6 System.out.println("从&qu

小猪的数据结构辅助教程——2.5 经典例子:约瑟夫问题的解决

小猪的数据结构辅助教程--2.5 经典例子:约瑟夫问题的解决 标签(空格分隔): 数据结构 约瑟夫问题的解析 关于问题的故事背景就不提了,我们直接说这个问题的内容吧: 一堆人,围成一个圈,然后规定一个数N,然后依次报数,当报数到N,这个人自杀,其他人鼓掌!啪啪啪, 接着又从1开始报数,报到N又自杀-以此类推,直到死剩最后一个人,那么游戏结束! 这就是问题,而我们用计算机模拟的话,用户输入:N(参与人数),M(第几个人死),结果返回最后一个人! 类似的问题有跳海问题,猴子选王等,下面我们就以N =

信号量基础和两个经典例子

信号量基础和两个经典例子 信号量(semaphore) 用于进程中传递信号的一个整数值. 三个操作: 1.一个信号量可以初始化为非负值 2.semWait操作可以使信号量减1,若信号量的值为负,则执行semWait的进程被阻塞.否则进程继续执行. 3.semSignal操作使信号量加1.若信号量的值小于等于0,则被semWait操作阻塞的进程讲被接触阻塞. ps: semWait对应P原语,semSignal对应V原语. 信号量以及PV原语的C语言定义如下 struct semaphore {

python经典例子

http://wangwei007.blog.51cto.com/68019/1106735  检查Linux系统日志error和mysql错误日志的脚本 http://wangwei007.blog.51cto.com/68019/1102836  pickle http://wangwei007.blog.51cto.com/68019/1045577  python用zipfile模块打包文件或是目录.解压zip文件实例 http://blog.163.com/kefan_1987/blo

小猪的数据结构辅助教程——2.6 经典例子:魔术师发牌问题和拉丁方阵问题

小猪的数据结构辅助教程--2.6 经典例子:魔术师发牌问题和拉丁方阵问题 标签(空格分隔): 数据结构 本节引言: 本节继续带来的是循环链表的两个经典例子,分别是魔术师发牌问题和拉丁方阵问题! 1.魔术师发牌问题 问题描述: 魔术师利用一副牌中的13张黑桃牌,预先将他们排好后叠放在一起,牌面朝下.对观众说:"我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示."魔术师将牌堆最上面的哪张排数为1,把他翻过来正好是黑桃A,将黑桃A从牌堆抽出放在桌子上,第二次数1.2

linux Posix 信号量 三 (经典例子)

本文将阐述一下信号量的作用及经典例子,当中包括“<越狱>寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和semSignal操作(V操作)的一些基本原则.(接下来同意称为P,V操作) 1. P操作,s - -,if(s<0)阻塞自己 2. V操作,s++,if(s<=0)唤醒一个其他进程 3. P,V操作时原语(通俗讲,就是执行PV操作时时不能被打打断的) 4. P,V操作总是成对出现的.P:资源申请/分配:V操

javascript经典例子

javascript经典例子  一.验证类 1.数字验证内 1.1 整数 1.2 大于0的整数 (用于传来的ID的验证) 1.3 负整数的验证 1.4 整数不能大于iMax 1.5 整数不能小于iMin 2.时间类 2.1 短时间,形如 (13:04:06) 2.2 短日期,形如 (2003-12-05) 2.3 长时间,形如 (2003-12-05 13:04:06) 2.4 只有年和月.形如(2003-05,或者2003-5) 2.5 只有小时和分钟,形如(12:03) 3.表单类 3.1 

const经典例子小结

在看这个例子之前,可以先看看:详解C和C++中的const和const和static变量的存放位置这样将会对const有非常全面的了解和认识: 下面我们将通过下面的例子看看const的一些非常不易发觉的错误: #include<iostream> using namespace std; class String { public: friend ostream& operator<<(ostream& os,const String& str); Stri

【C++系列经典例子】C++默认构造,拷贝,赋值,析构四函数

本例子来自于学习视频,不是原创. 首先,我们已经知道我们创建类时会有四个默认函数(实际是有6个,具体以后再探究) 分别是:(以test类为例子) class test { private: int value; } 1.构造函数: test(int x=0) 2.拷贝构造函数: test(const test& it) 3.赋值函数 test &operator(const test& it) 4.析构函数 ~test() 以下是具体应用四个函数的过程的一个经典例子,能让我们更好的