jstorm系列-2:入门
有了基本的概念之后,我们用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:入门的更多相关文章
- .NET 4 并行(多核)编程系列之一入门介绍
.NET 4 并行(多核)编程系列之一入门介绍 本系列文章将会对.NET 4中的并行编程技术(也称之为多核编程技术)以及应用作全面的介绍. 本篇文章的议题如下: 1. 并行编程和多线程编程的区别. ...
- Google C++测试框架系列:入门
Google C++测试框架系列:入门 原始链接:V1_6_Primer 注 GTest或者Google Test: Google的C++测试框架. Test Fixtures: 这个词实在找不到对应 ...
- Pandas系列之入门篇
Pandas系列之入门篇 简介 pandas 是 python用来数据清洗.分析的包,可以使用类sql的语法方便的进行数据关联.查询,属于内存计算范畴, 效率远远高于硬盘计算的数据库存储.另外pand ...
- Pandas系列之入门篇——HDF5
Pandas系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响, 压缩效率越高,查询效率越低.pandas ...
- Python系列之入门篇——HDFS
Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...
- Python系列之入门篇——MYSQL
Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...
- 【转】C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 标签: c#objectnewlineexceptionbytestring 2010-05-17 01:10 117109人阅读 ...
- jstorm系列-1:入门
一. Storm整体介绍 Storm 是一个类似Hadoop MapReduce的系统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这 ...
- pyqt系列原创入门教程
pyqt4入门教程 python pyqt4 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 通过pyqt可以实现很多我们想要的功能 ...
随机推荐
- BZOJ2453:维护队列——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2453 Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到 ...
- SpringBoot-配置文件属性注入-3种方式
配置文件: datasource.username = admin datasource.url = /hello/world 方式一: @Value 前提: <!-- JavaBean处理工具 ...
- Redux的State不应该全部放在Store里
使用了redux管理应用的状态,应用的状态不应该全部放在Store里面. 前端状态主要有一下两种: 1. Domain data 2. UI State 1. Domain data 来自于服务端对领 ...
- YBT 2.4 AC自动机
其实这个专题NOIP几乎不考 AC自动机,就是能让题自动AC的东西,是不是十分神奇 对的,就是这么神奇 AC自动机是解决多模式串与文本串匹配的问题 是KMP+Trie树的结合,也是一个毒瘤算法 Key ...
- Markdown资料收集
教程介绍 原生Markdown不支持表格,表格属于扩展Markdown语法 快速入门:https://github.com/riku/Markdown-Syntax-CN/blob/master/ba ...
- 深入JavaScript对象创建的细节
最近深入学习javascript后,有个体会:面向对象的方式编程才是高效灵活的编程,也是现在唯一可以让代码更加健壮的编程方式.如果我们抛开那些玄乎的抽象出类等等思想,我自己对面向对象的从写程序的角度理 ...
- What is the bitmap index?
示例执行计划: postgres ; QUERY PLAN ---------------------------------------------------------------------- ...
- Java的switch是否支持String作为参数,还支持哪些类型?
在Java5以前,switch(expr)中,exper只能是byte,short,char,int类型. 从Java5开始,java中引入了枚举类型,即enum类型. 从Java7开始,exper还 ...
- Sql Server 2008 R2 数据库脚本导出方法
经常忘记怎么搞,截几张图记录一下. 1 选中要导出的数据库,右键—>任务—>生成脚本 2 3 4 查看保存的脚本
- ACM2647拓扑排序逆运算
2647题是对工人排序问题,不是从头到尾排序,而是从尾到头排序: 代码中用到vector和queue容器,权当练习. 用广搜进行拓扑排序的逆运算. #include<iostream> # ...