【转】apache storm 内置的定时机制
原文:http://www.cnblogs.com/kqdongnanf/p/4778672.html
------------------------------------------------------------------------------------------------------------------------------------
关于Storm tick
1. tick的功能
Apache Storm中内置了一种定时机制——tick,它能够让任何bolt的所有task每隔一段时间(精确到秒级,用户可以自定义)收到一个来自__systemd的__tick stream的tick tuple,bolt收到这样的tuple后可以根据业务需求完成相应的处理。
Tick功能从Apache Storm 0.8.0版本开始支持,本文在Apache Storm 0.9.1上测试。
2. 在代码中使用tick及其作用
在代码中如需使用tick,可以参照下面的方式:
2.1. 为bolt设置tick
若希望某个bolt每隔一段时间做一些操作,那么可以将bolt继承BaseBasicBolt/BaseRichBolt,并重写getComponentConfiguration()方法。在方法中设置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值,单位是秒。
getComponentConfiguration()是backtype.storm.topology.IComponent接口中定义的方法,在此方法的实现中可以定义以”Topology.*”开头的此bolt特定的Config。

这样设置之后,此bolt的所有task都会每隔一段时间收到一个来自__systemd的__tick stream的tick tuple,因此execute()方法可以实现如下:

2.2. 为Topology全局设置tick
若希望Topology中的每个bolt都每隔一段时间做一些操作,那么可以定义一个Topology全局的tick,同样是设置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值:

2.3. tick设置的优先级
与Linux中的环境变量的优先级类似,storm中的tick也有优先级,即全局tick的作用域是全局bolt,但对每个bolt其优先级低于此bolt定义的tick。
这个参数的名字TOPOLOGY_TICK_TUPLE_FREQ_SECS具有一定的迷惑性,一眼看上去应该是Topology全局的,但实际上每个bolt也可以自己定义。
2.4. tick的精确度
Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS是精确到秒级的。例如某bolt设置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS为10s,理论上说bolt的每个task应该每个10s收到一个tick tuple。实际测试发现,这个时间间隔的精确性是很高的,一般延迟(而不是提前)时间在1ms左右。测试环境:3台虚拟机做supervisor,每台配置:4Cpu、16G内存、千兆网卡。
3. storm tick的实现原理
在bolt中的getComponentConfiguration()定义了该bolt的特定的配置后,storm框架会在TopologyBuilder.setBolt()方法中调用bolt的getComponentConfiguration()方法,从而设置该bolt的配置。
调用路径为:TopologyBuilder.setBolt()
-> TopologyBuilder.initCommon()
-> getComponentConfiguration()
4. 附件
测试使用的代码:
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
 | 
package storm.starter;import backtype.storm.Config;import backtype.storm.Constants;import backtype.storm.LocalCluster;import backtype.storm.StormSubmitter;import backtype.storm.task.ShellBolt;import backtype.storm.topology.BasicOutputCollector;import backtype.storm.topology.IRichBolt;import backtype.storm.topology.OutputFieldsDeclarer;import backtype.storm.topology.TopologyBuilder;import backtype.storm.topology.base.BaseBasicBolt;import backtype.storm.topology.base.BaseRichBolt;import backtype.storm.tuple.Fields;import backtype.storm.tuple.Tuple;import backtype.storm.tuple.Values;import storm.starter.spout.RandomSentenceSpout;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;public class MyTickTestTopology {  public static class WordCount extends BaseBasicBolt {    Map<String, Integer> counts = new HashMap<String, Integer>();              @Override    public void execute(Tuple tuple, BasicOutputCollector collector) {             if (tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)         && tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID)){          System.out.println("################################WorldCount bolt: "                                 + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));      }      else{          collector.emit(new Values("a", 1));      }    }    @Override    public void declareOutputFields(OutputFieldsDeclarer declarer) {      declarer.declare(new Fields("word", "count"));    }         @Override    public Map<String, Object> getComponentConfiguration() {            Config conf = new Config();            conf.put(conf.TOPOLOGY_TICK_TUPLE_FREQ_SECS,10);            return conf;    }  }     public static class TickTest extends BaseBasicBolt{                      @Override        public void execute(Tuple tuple, BasicOutputCollector collector) {            // 收到的tuple是tick tuple          if (tuple.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)             && tuple.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID)){              System.out.println("################################TickTest bolt: "                                  + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").format(new Date()));            }            // 收到的tuple时正常的tuple          else{              collector.emit(new Values("a"));            }                   }        @Override        public void declareOutputFields(OutputFieldsDeclarer declarer) {          declarer.declare(new Fields("test"));        }                 @Override        public Map<String, Object> getComponentConfiguration() {                Config conf = new Config();                conf.put(conf.TOPOLOGY_TICK_TUPLE_FREQ_SECS,20);                return conf;        }      }  public static void main(String[] args) throws Exception {    TopologyBuilder builder = new TopologyBuilder();    builder.setSpout("spout", new RandomSentenceSpout(), 3);    builder.setBolt("count", new WordCount(), 3).shuffleGrouping("spout");    builder.setBolt("tickTest", new TickTest(), 3).shuffleGrouping("count");    Config conf = new Config();    conf.put(conf.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 7);    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(10000);//      cluster.shutdown();    }  }} | 
【转】apache storm 内置的定时机制的更多相关文章
- Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
		
摘要: Fundebug 的 JavaScript 错误监控插件同步支持 Vue.js 异步错误监控. Vue.js 从诞生至今已经 5 年,尤大在今年 2 月份发布了重大更新,即Vue 2.6.更新 ...
 - apache shiro内置过滤器 标签 注解
		
内置过滤器 anon(匿名) org.apache.shiro.web.filter.authc.AnonymousFilter authc(身份验证) org.apache.shiro ...
 - Apache使用内置插件mod_php解析php的配置
		
apache安装完毕之后,修改httpd.conf配置文件,添加代码如下: LoadModule php5_module modules/libphp5.so <FilesMatch \.php ...
 - Spring Cloud内置的Zuul过滤器详解
		
Spring Cloud默认为Zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@EnableZuulServer.@EnableZuulProxy两个注解进行展开,相信大家对这两个 ...
 - SpringBoot(十四)_springboot使用内置定时任务Scheduled的使用(一)
		
为什么使用定时? 日常工作中,经常会用到定时任务,比如各种统计,并不要求实时性.此时可以通过提前设置定时任务先把数据跑出来,后续处理起来更方便. 本篇文章主要介绍 springboot内置定时任务. ...
 - JAVA并发-内置锁和ThreadLocal
		
上一篇博客讲过,当多个线程访问共享的可变变量的时候,可以使用锁来进行线程同步.那么如果线程安全性存在的3个前提条件不同时存在的话,自然就不需要考虑线程安全性了.或者说如果我们能够将某个共享变量变为局部 ...
 - UVM RAL模型和内置seq
		
转载:UVM RAL模型:用法和应用_寄存器 (sohu.com) 在系统设计中通常会面临两大挑战:缩小技术节点的规模和上市时间(TTM,Time to Market).为了适应激烈的市场竞争,大多数 ...
 - Apache Spark 3.0 将内置支持 GPU 调度
		
如今大数据和机器学习已经有了很大的结合,在机器学习里面,因为计算迭代的时间可能会很长,开发人员一般会选择使用 GPU.FPGA 或 TPU 来加速计算.在 Apache Hadoop 3.1 版本里面 ...
 - spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv
		
在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程 中的SparkEnv和 spark 源码分析之四 -- TaskScheduler的创建和启动过程 中的C ...
 
随机推荐
- zabbix设置多个收件人
			
1.建群组 2.添加群组权限 3.添加用户,归属到上面新建的组 4.动作里发送消息给新建的组 5.这样设置后,管理员账号不用设置收件媒介
 - dockerfile 的最佳实践
			
Dockerfile 编写nginx容器 [root@mast nginx]# cat Dockerfile FROM centos MAINTAINER zhaoruidong RUN yum -y ...
 - 输入3个数a,b,c,按大小顺序输出。
			
题目:输入3个数a,b,c,按大小顺序输出. 思路: 根据最简单的, 经典的C语言算法, 两两相互交换得到他们的顺序 public class 第三十四题abc三个数大小排序 { public sta ...
 - python爬虫---从零开始(六)Selenium库
			
什么是Selenium库: 自动化测试工具,支持多种浏览器.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera ...
 - No-3.Linux 终端命令格式
			
Linux 终端命令格式 01. 终端命令格式 command [-options] [parameter] 说明: command:命令名,相应功能的英文单词或单词的缩写 [-options]:选项 ...
 - Puppeteer-常规操作一
			
这里不讲 Puppeteer 怎么使用,主要讲一些常规操作在这里如何通过另类方法实现.等实现后,你就会感觉,嗯~~ 真香! 场景一 已经找出要的元素,现在有需求再继续寻找他的子元素 第一种.将父元素带 ...
 - 「 HDOJ P2227 」 Find the nondecreasing subsequences
			
# 题目大意 就是找不下降子序列的个数. # 解题思路 一开始想着先离散化,然后再做个 $dp$,发现用 $dp$ 的话时间复杂度是 $\text{O}(n^2)$ 的,稳稳超时. 这里说说 $dp$ ...
 - [LUOGU] P3004 [USACO10DEC]宝箱Treasure Chest
			
第一眼:区间DP,可以瞎搞 f[i][j]=max(sum(i,j)-f[i+1][j],sum(i,j)-f[i][j-1]) 提出来就是f[i][j]=sum(i,j)-min(f[i+1][j] ...
 - InnoDB INFORMATION_SCHEMA Lock Tables
			
InnoDB INFORMATION_SCHEMA Lock Tables 三张InnoDB INFORMATION_SCHEMA表使您能够监视事务并诊断潜在的锁定问题: INNODB_TRX:提供有 ...
 - (9) openssl enc(对称加密)
			
对称加密工具,了解对称加密的原理后就很简单了,原理部分见下文. openssl enc -ciphername [-in filename] [-out filename] [-pa ...