Storm tick 功能
1. tick的功能
Apache Storm中內(nèi)置了一種定時(shí)機(jī)制——tick,它能夠讓任何bolt的所有task每隔一段時(shí)間(精確到秒級(jí),用戶可以自定義)收到一個(gè)來(lái)自__systemd的__tick stream的tick tuple,bolt收到這樣的tuple后可以根據(jù)業(yè)務(wù)需求完成相應(yīng)的處理。
2017-06-20 14:39:08.100 STDIO [INFO] 我是定時(shí)執(zhí)行任務(wù)pipade,消息為:source: __system:-1, stream: __tick, id: {}, [10]2. 在代碼中使用tick及其作用
在代碼中如需使用tick,可以參照下面的方式
2.1. 為指定bolt設(shè)置tick
希望某個(gè)bolt每隔一段時(shí)間做一些操作,那么可以將bolt繼承BaseBasicBolt/BaseRichBolt,并重寫getComponentConfiguration()方法。
在方法中設(shè)置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值,單位是秒。
getComponentConfiguration()是org.apache.storm.topology.IComponent接口中定義的方法,在該方法定義此Bolt特定的Config
@Override public Map<String, Object> getComponentConfiguration() {// TODO Auto-generated method stubConfig config=new Config();config.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10);return config; }-這樣設(shè)置之后,此bolt的所有task都會(huì)每隔一段時(shí)間收到一個(gè)來(lái)自__systemd的__tick stream的tick tuple,因此execute()方法可以實(shí)現(xiàn)如下:
@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("我是定時(shí)執(zhí)行任務(wù)pipade,消息為:"+input.toString());return;}//收到正常的Tuple,正常處理邏輯... }2.2. 為Topology全局設(shè)置tick
若希望Topology中的每個(gè)bolt都每隔一段時(shí)間做一些操作,那么可以定義一個(gè)Topology全局的tick,同樣是設(shè)置Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS的值:
//在main函數(shù)啟動(dòng)中設(shè)置 Config conf = new Config(); conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 10); StormSubmitter.submitTopology("wordcount-online", conf, builder.createTopology());2.3. tick設(shè)置的優(yōu)先級(jí)
與Linux中的環(huán)境變量的優(yōu)先級(jí)類似,storm中的tick也有優(yōu)先級(jí),全局tick的優(yōu)先級(jí)低于局部Bolt定義的tick,即兩個(gè)同時(shí)存在以局部為準(zhǔn),否則以全局為準(zhǔn)。
這個(gè)參數(shù)的名字TOPOLOGY_TICK_TUPLE_FREQ_SECS具有一定的迷惑性,一眼看上去應(yīng)該是Topology全局的,但實(shí)際上每個(gè)bolt也可以自己定義。
2.4. tick的精確度
Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS是精確到秒級(jí)的。例如某bolt設(shè)置 Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS為10s,理論上說(shuō)bolt的每個(gè)task應(yīng)該每個(gè)10s收到一個(gè)tick tuple。實(shí)際測(cè)試發(fā)現(xiàn),這個(gè)時(shí)間間隔的精確性是很高的,一般延遲(而不是提前)時(shí)間在1ms左右。測(cè)試環(huán)境:3臺(tái)虛擬機(jī)做supervisor,每臺(tái)配置:4Cpu、16G內(nèi)存、千兆網(wǎng)卡。
3. storm tick的實(shí)現(xiàn)原理
在bolt中的getComponentConfiguration()定義了該bolt的特定的配置后,storm框架會(huì)在TopologyBuilder.setBolt()方法中調(diào)用bolt的getComponentConfiguration()方法,從而設(shè)置該bolt的配置。
調(diào)用路徑為:TopologyBuilder.setBolt()-> TopologyBuilder.initCommon()-> getComponentConfiguration()
注:當(dāng)topologyDeactivate時(shí),tick任務(wù)還是依然執(zhí)行
總結(jié)
以上是生活随笔為你收集整理的Storm tick 功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hbase Region in tra
- 下一篇: OpenTSDB 安装