做爲commiter和user,我仍是很是看好它的應用前景,下面是在團隊內的分享介紹,更多請參考https://github.com/alibaba/jstormpython
1、jstorm是什麼git
jstorm能夠看做是storm的java加強版本,除了內核用純java實現外,還包括了thrift、python、facet ui。從架構上看,其本質是一個基於zk的分佈式調度系統
github
Jstorm主要應用場景有:apache
1.信息流處理,如聚合、分析等緩存
2.持續計算,如實時數據統計、監控網絡
3.分佈式rpc調用架構
Jstorm在內核上對storm的改進有:併發
(1)模型簡化框架
(2)多維度資源調度
(3)網絡通訊層改造
(4)採樣重構
(5)worker/task內部異步化處理
(6)classload、HA
模型簡化將storm的三層管理模型簡化爲兩層
jstorm中task直接對應了線程概念,而在storm中是task只是線程executor的一個執行邏輯單元
多維度資源調度 分爲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的啓動
3. 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等