Jstorm是參考storm的實時流式計算框架

Jstorm是參考storm的實時流式計算框架,在網絡IO、線程模型、資源調度、可用性及穩定性上作了持續改進,已被愈來愈多企業使用 做爲commiter和user,我仍是很是看好它的應用前景,下面是在團隊內的分享介紹,更多請參考https://github.com/alibaba/jstorm 1、jstorm是什麼 jstorm能夠看做是storm的java加強版本,除了內核用純java實現外,還包括了thrift、python、facet ui。從架構上看,其本質是一個基於zk的分佈式調度系統java

Jstorm主要應用場景有:
 1.信息流處理,如聚合、分析等
 2.持續計算,如實時數據統計、監控
 3.分佈式rpc調用

Jstorm在內核上對storm的改進有: (1)模型簡化 (2)多維度資源調度 (3)網絡通訊層改造 (4)採樣重構 (5)worker/task內部異步化處理 (6)classload、HApython

模型簡化將storm的三層管理模型簡化爲兩層 git

jstorm中task直接對應了線程概念,而在storm中是task只是線程executor的一個執行邏輯單元github

多維度資源調度 分爲cpu、memory、net、disk四個維度,默認狀況下: cpu slots = 機器核數 * 2 -1 memory slots = 機器物理內存 / 1024M net slots = min(cpu slots, memory slots)緩存

網絡通訊層 採用了netty + disruptor 替換 zmq + blockingQueue網絡

採樣重構 a.定義了滾動時間窗口 b.優化緩存map性能 c.增量採樣時間以及減小無謂數據架構

Worker/Task內部異步化 異步化和回調是流式框架最基本的兩大特徵,Jstorm在task的計算中將nextTuple和ack/fail的邏輯分離開來,並在worker中採用單獨線程負責流入、流出數據的反序列化及序列化工做併發

有關jstorm實現的幾個關鍵流程,有興趣的能夠參考源碼 1.Nimbus的啓動框架

2.supervisor的啓動運維

  1. worker內部結構

worker的啓動須要完成如下幾件事: a.讀取配置文件,啓動進程 b.初始化tuple接收隊列和發送隊列 c.打開端口,啓動rpc服務 d.建立context結構,<component, <stream, output_field>> e.觸發各類timer,refresh/reconnection/heartbeat...

task的工做包括: a.建立內部隊列,bind connection b.反射component拿到taskObj,建立具體的spout/bolt executor c.反序列化tuple數據,執行處理邏輯 d.作stats,heartbeat等

jstorm在數據的完整性和準確性上分別依賴了acker和事務機制 acker本質是獨立的bolt,input是fieldGrouping,output是directGrouping; 每一個bolt有兩個output stream(ACKER_ACK_STREAM_ID/ACKER_ACK_FAIL_STREAM_ID) 每一個spout有一個output stream(ACKER_INIT_STREAM_ID),以及兩個input stream(ACKER_ACK_STREAM_ID/ACKER_ACK_FAIL_STREAM_ID) Spout 發送給acker 的value <rootid, xor(target_task_list)> 發送下一級bolt 的value <rootid, 目標taskid> Bolt 下一級bolt須要ack發送給下一級bolt 爲<rootid, 新uuid)>發送給acker的value爲<rootid, xor(新uuid, $(接收值))> 下一級bolt不須要ack發送給下一級bolt 爲空發送給acker爲<rootid, $(接收值)>

事務:批處理+全局惟一遞增id+兩階段提交 在發送tuple的時候帶上tid來保證「只有一次」的原語,下游邏輯根據tid是否next tid來判斷是否須要處理。爲了提升效率,會將多個tuple組裝成一批賦予一個tid,並用pipeline方式執行processing和commit階段,其中processing能夠併發執行,而commit具備嚴格的強順序性。接口coordinator,commitor中作了狀態管理、事務協調、錯誤檢查等工做

另一個用得最多的高級特性就是trident,它對bolt進行了封裝,提供瞭如joins、aggregations、grouping、filters、function等多種高級數據處理能力

最後,談談有關jstorm的運維開發 (1)配置優先級:代碼 > jstorm.yaml > default.yaml (2)stream流對比: a.fieldsGrouping b.globalGrouping - target componet的第一個task c.shuffleGrouping - 自定義random,更平均 d.noneGrouping - 調用random e.allGrouping - target component全部task f.directGrouping - 指定目標task g.customGrouping - 接口customStreamGrouping (3)jvm調優,優先考慮新生代,而後開啓碎片整理 (4)同一worker內的task,開啓定向調度避免網絡開銷 (5)優雅關閉,reblance或kill前先deactive,等待msg_timeout進行數據清理 (6)其它,hooks、queue-size、topology.max.spout.pending等

相關文章
相關標籤/搜索