一. 简介
     storm作为流计算,处理数据通常以数据驱动。即只有当spout发射数据才会进行计算。那么如果想要做定时任务如何处理哪,例如有的bolt需要输出一段时间统计的结果,这里一段时间可能是几秒、几分钟或者几小时。如果还是以数据进行驱动的话必然会输出时间不可确定。同样也可以启一个线程一段时间执行一次,这也是一种解决方案。但是我希望有种更优雅的解决方案,就是这里说的tick。tick是由storm框架进行计时,到达设定时间会发送一个特殊的tuple:ticktuple,此时处理定时任务就可以了。
二. 代码
     如果是某一个bolt由定时需求的话,可以按照一下方式设置
  1. 继承BaseBasicBolt
  2. getComponentConfiguration方法设置发送ticktuple间隔时间(单位s)
  3. execute方法判断tuple类型,如果为ticktuple处理定时任务,如果不是处理其他任务。
以下是wordCount中CountBolt代码,每5s输出各单词统计的数据。
 //继承 BaseBasicBolt
public class CountTickBolt extends BaseBasicBolt {
private static final Logger logger = LoggerFactory.getLogger(CountTickBolt.class);
private Map<String, Integer> count;
private Long time; @Override
public Map<String, Object> getComponentConfiguration() {
//设置发送ticktuple的时间间隔
Config conf = new Config();
conf.put(conf.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 5);
return conf;
} @Override
public void prepare(Map stormConf, TopologyContext context) {
super.prepare(stormConf, context);
count = new HashMap<String, Integer>();
time = System.currentTimeMillis();
} @Override
public void cleanup() {
super.cleanup();
} @Override
public void execute(Tuple input, BasicOutputCollector collector) {
//判断是否为tickTuple
if (input.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID) &&
input.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID)){
//是,处理定时任务
Long nowTime = System.currentTimeMillis();
Long useTime = nowTime - time;
StringBuffer sb = new StringBuffer();
sb.append("======== Use Time :" + useTime + "========\r\n");
for (Map.Entry wordCount : count.entrySet()){
sb.append(wordCount.getKey() + "------>" + wordCount.getValue() + "\r\n");
}
Long nnTime = System.currentTimeMillis();
logger.info(sb.toString() + (nnTime - nowTime) );
time = nnTime;
}else {
//否,处理其他数据
String word = input.getString(0);
if (count.containsKey(word)){
int thisWordCont = count.get(word);
count.put(word, ++thisWordCont);
}else {
count.put(word,1);
}
}
} @Override
public void declareOutputFields(OutputFieldsDeclarer declarer) { }
三. 总结
     以上是一个简单的介绍,需要说明的是由于设置时间间隔是秒级的,所以在处理时会有毫秒级的误差,通常是± 2ms。
  以下是没有介绍或者测试到的地方,在以后会补上。
  1. 如何设置此拓扑中所有的spout和bolt都定时处理。
  2. 由于是tuple类型数据,当正常tuple数据量过大时是否会造成tickTuple延时消费。

storm定时任务【tick】的更多相关文章

  1. Storm编程入门API系列之Storm的定时任务实现

    概念,见博客 Storm概念学习系列之storm的定时任务 Storm的定时任务,分为两种实现方式,都是可以达到目的的. 我这里,分为StormTopologyTimer1.java   和  Sto ...

  2. Storm编程入门API系列之Storm的Topology的stream grouping

    概念,见博客 Storm概念学习系列之stream grouping(流分组) Storm的stream grouping的Shuffle Grouping 它是随机分组,随机派发stream里面的t ...

  3. Storm编程入门API系列之Storm的可靠性的ACK消息确认机制

    概念,见博客 Storm概念学习系列之storm的可靠性  什么业务场景需要storm可靠性的ACK确认机制? 答:想要保住数据不丢,或者保住数据总是被处理.即若没被处理的,得让我们知道. publi ...

  4. Spark Streaming笔记——技术点汇总

    目录 目录 概况 原理 API DStream WordCount示例 Input DStream Transformation Operation Output Operation 缓存与持久化 C ...

  5. Spark学习笔记(三)-Spark Streaming

    Spark Streaming支持实时数据流的可扩展(scalable).高吞吐(high-throughput).容错(fault-tolerant)的流处理(stream processing). ...

  6. Storm框架:如何实现crontab定时任务

    Storm除了能对消息流进行处理,还能实现crontab定时任务. 只要在bolt中配置TOPOLOGY_TICK_TUPLE_FREQ_SECS项即可实现. @Override public Map ...

  7. 关于Storm tick

    关于Storm tick 1. tick的功能 Apache Storm中内置了一种定时机制——tick,它能够让任何bolt的所有task每隔一段时间(精确到秒级,用户可以自定义)收到一个来自__s ...

  8. Storm中的定时任务

    1.全局定时器 import java.util.Map; import backtype.storm.Config; import backtype.storm.Constants; import ...

  9. storm的定时任务

    应用场景: 第一种方法 参考代码StormTopologyTimer1.java package yehua.storm; import java.util.Map; import org.apach ...

随机推荐

  1. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

  2. juery悬浮框

    现在的淘宝啊,京东啊等很多平台都用到了一个技术,就是当页面下拉时,某个div会一直悬浮在页面顶端.具体代码如下<p>jQuery实现页面滚动时层智能浮动定位</p><!D ...

  3. Named function expressions demystified

    Introduction Surprisingly, a topic of named function expressions doesn't seem to be covered well eno ...

  4. [转]DevExpress GridControl 关于使用CardView的一点小结

    最近项目里需要显示商品的一系列图片,打算用CardView来显示,由于第一次使用,遇到许多问题,发现网上这方面的资源很少,所以把自己的一点点实际经验小结一下,供自己和大家以后参考. 1.选择CardV ...

  5. Why we don’t recommend using List<T> in public APIs

    不推荐List<T>做API原因有如下两点:1.首先List<T> 设计之初就没有设计成可扩展的,我们不能重新其任何方法.这就意味着,我们操作List<T>的时候却 ...

  6. java复习(2)---java基础杂记

    java命名规范: 参考:http://www.cnblogs.com/maowang1991/archive/2013/06/29/3162366.html 1.项目名小写 2.包名小写 3.类名每 ...

  7. 关于Java中volatile关键字笔记

    volatile通常被认为是一种轻量级的synchronized,字面上它表示易变的,在并发编程中,它保证了共享变量的可见性.所谓可见性指的是,某个线程对变量进行操作后,其他线程能够读取到操作后的最新 ...

  8. bzoj4784 [Zjoi2017]仙人掌

    Description 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得 ...

  9. MarkDown本地图片上传工具制作总结

    引言:开始尝试使用MarkDown语法写文档,发现图片必须用外链的形式才能插入到文章中,而自己平时最常用的插入图片方式就是QQ截屏,觉得很不方便所以制作的小工具辅助上传,因为时间和水平有限,其实代码写 ...

  10. 欲练JS,必先攻CSS——前端修行之路(码易直播)

    以下是直播大概内容的文字版: 感谢大家今天来到直播间收听本期的码易直播.今天我讲的主题是css,具体聊一下我大概的css学习历史,分享一些干货,希望这次分享对大家有所启发和帮助. 个人的css历史: ...