公众号编辑器365,保定seo推广,天津建设网站官网,网站前置审批类型1. tick的功能
Apache Storm中内置了一种定时机制——tick#xff0c;它能够让任何bolt的所有task每隔一段时间#xff08;精确到秒级#xff0c;用户可以自定义#xff09;收到一个来自__systemd的__tick stream的tick tuple#xff0c;bolt收到这样的tuple后可以根据业…1. tick的功能
Apache Storm中内置了一种定时机制——tick它能够让任何bolt的所有task每隔一段时间精确到秒级用户可以自定义收到一个来自__systemd的__tick stream的tick tuplebolt收到这样的tuple后可以根据业务需求完成相应的处理。
2017-06-20 14:39:08.100 STDIO [INFO] 我是定时执行任务pipade消息为source: __system:-1, stream: __tick, id: {}, [10]
2. 在代码中使用tick及其作用
在代码中如需使用tick可以参照下面的方式
2.1. 为指定bolt设置tick
希望某个bolt每隔一段时间做一些操作那么可以将bolt继承BaseBasicBolt/BaseRichBolt并重写getComponentConfiguration()方法。 在方法中设置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值单位是秒。
Config confignew Config();
config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);
getComponentConfiguration()是org.apache.storm.topology.IComponent接口中定义的方法在该方法定义此Bolt特定的Config
Override
public MapString, Object getComponentConfiguration() {// TODO Auto-generated method stubConfig confignew Config();config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);return config;
}
-这样设置之后此bolt的所有task都会每隔一段时间收到一个来自__systemd的__tick stream的tick tuple因此execute()方法可以实现如下
Override
public void execute(Tuple input) {// TODO Auto-generated method stubif (input.getSourceComponent().equals(Constants.SYSTEM_COMPONENT_ID)|| input.getSourceStreamId().equals(Constants.SYSTEM_TICK_STREAM_ID)) {this.outputCollector.ack(input);System.out.println(我是定时执行任务pipade消息为input.toString());return;}//收到正常的Tuple正常处理逻辑...
}
2.2. 为Topology全局设置tick
若希望Topology中的每个bolt都每隔一段时间做一些操作那么可以定义一个Topology全局的tick同样是设置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值
//在main函数启动中设置
Config conf new Config();
conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);
StormSubmitter.submitTopology(wordcount-online, conf, builder.createTopology());
2.3. tick设置的优先级
与Linux中的环境变量的优先级类似storm中的tick也有优先级全局tick的优先级低于局部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()
注当topologyDeactivate时tick任务还是依然执行