有了基本的概念之后,我们用jstorm来做一点小事情吧

做一个很无聊的事情:给定一个时间戳,输出对应的问候语

规则是:时间戳的十位对应的数字对应不同的时间段,0-2代表早上,3代表中午,4-6代表下午,7-9代表晚上,分别输出早上,中午,下午和晚上。

我们用spout来发送时间戳,bolt来处理时间戳并输出对应的问候语,并且统计每一时间段的问候数目,判断时间戳的生成是否随机。

代码如下:

public class TimeStampSpout implements IRichSpout{
private static final long serialVersionUID = 1L;
private SpoutOutputCollector collector; @Override
    。。。。一切没有用到的函数不展示 @Override
public void nextTuple() {
long now = System.currentTimeMillis();
Values tuple = new Values(now);
System.out.println("spout:"+tuple);
this.collector.emit(tuple);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
this.collector = collector;
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("timestamp"));
} }
public class GreetingBolt implements IRichBolt{
private static final long serialVersionUID = 1L;
private static Map<String, Integer> count = new TreeMap<String, Integer>();
private final String morning = "morning";
private final String noon = "noon";
private final String afternoon = "afternoon";
private final String evening = "evening";
private static Integer total = 0;
@Override
public void cleanup() {
} @Override
public void execute(Tuple input) {
long timestamp= input.getLong(0);
// System.out.println("bolt:"+timestamp);
total+=1;
// 获取十位数
long second = (timestamp/10)%10;
if(second<3){
System.out.println("bolt:"+morning);
count.put(morning, (count.get(morning)==null)?1:count.get(morning)+1);
}
else if(second==3){
System.out.println("bolt:"+noon);
count.put(noon, (count.get(noon)==null)?1:count.get(noon)+1);
}
else if(second<8){
System.out.println("bolt:"+afternoon);
count.put(afternoon, (count.get(afternoon)==null)?1:count.get(afternoon)+1);
}
else{
System.out.println("bolt:"+evening);
count.put(evening, (count.get(evening)==null?1:count.get(evening)+1));
}
if(total%10==0){
System.out.println("distribution show as followed:");
System.out.println(morning+":"+1.0*((count.get(morning)==null)?0:count.get(morning))/total);
System.out.println(noon+":"+1.0*((count.get(noon)==null?0:count.get(noon)))/total);
System.out.println(afternoon+":"+1.0*((count.get(afternoon)==null?0:count.get(afternoon)))/total);
System.out.println(evening+":"+1.0*((count.get(evening)==null?0:count.get(evening)))/total);
}
} }
public class TestTopology {
public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("TimeStampSpout", new TimeStampSpout());
builder.setBolt("GreetingBolt",new GreetingBolt()).shuffleGrouping("TimeStampSpout");
LocalCluster cluster = new LocalCluster();
Config config = new Config();
cluster.submitTopology("test", config, builder.createTopology());
}
}

p

jstorm系列-2:入门的更多相关文章

  1. .NET 4 并行(多核)编程系列之一入门介绍

    .NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下:  1. 并行编程和多线程编程的区别.  ...

  2. Google C++测试框架系列:入门

    Google C++测试框架系列:入门 原始链接:V1_6_Primer 注 GTest或者Google Test: Google的C++测试框架. Test Fixtures: 这个词实在找不到对应 ...

  3. Pandas系列之入门篇

    Pandas系列之入门篇 简介 pandas 是 python用来数据清洗.分析的包,可以使用类sql的语法方便的进行数据关联.查询,属于内存计算范畴, 效率远远高于硬盘计算的数据库存储.另外pand ...

  4. Pandas系列之入门篇——HDF5

    Pandas系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响, 压缩效率越高,查询效率越低.pandas ...

  5. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  6. Python系列之入门篇——MYSQL

    Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...

  7. 【转】C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。

    C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 标签: c#objectnewlineexceptionbytestring 2010-05-17 01:10 117109人阅读 ...

  8. jstorm系列-1:入门

    一.             Storm整体介绍 Storm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这 ...

  9. pyqt系列原创入门教程

    pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...

随机推荐

  1. 如何给apk文件签名

    1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本 ...

  2. mysql的主从复制原理与实现

    关于mysql的主从复制,之前一直在听说这个话题,一直没有实现,昨天学习了下,原来是这么回事: 既然是主从复制,那么肯定有主有从,也就说一个主数据库(一般为写库),一个从数据库(读库).主数据库更新了 ...

  3. 题解【luoguP4053 bzojP1029 [JSOI2007]建筑抢修】

    洛谷题链 bzoj题链 PS: \(t_i\) : 在什么时候建筑 \(i\) 自爆 \(a_i\) : 修复 \(i\) 所花时间 题解 算法:贪心+堆维护 贪心策略: 直接按 \(t\) 贪心?显 ...

  4. Qt中内存泄露和退出崩溃的问题 delete

    Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错. 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一对应):d ...

  5. robots.txt使用和优化技巧

    一.利于网站优化的robots.txt使用技巧 1.在线建站提供方便之路.当我们将域名解析到服务器,可以访问站点了,可是这个时候站点还没有布局好,meta标签还一塌糊涂.乳沟此时的站点被 搜索引擎蜘蛛 ...

  6. 【updating】python读书笔记-The Django Book2.0(for django1.4)

    原文:http://www.djangobook.com/en/2.0/frontmatter.html 译文:http://djangobook.py3k.cn/2.0/ 或者http://docs ...

  7. PHP系统编程--01.多进程与多线程

    PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程.fork调用后执行的代码将是并行的. PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特 ...

  8. 解决nginx在记录post数据时 中文字符转成16进制的问题【转载】

    1. 问题描述 nginx 在获取post数据时候,如果是中文,则转换成16进制显示在日志文件中,如下图所示.   Paste_Image.png 日志格式为: log_format postdata ...

  9. ? 初识Webx 2

    初识Webx 1: http://www.cnblogs.com/lddbupt/p/5547189.html Webx Framework负责完成一系列基础性的任务. 比如系统初始化和响应请求. 系 ...

  10. Java 异常(Java Exception)

    Java异常    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类 ...