jstorm簡介(轉)

  Jstorm是參考storm的實時流式計算框架,在網絡IO、線程模型、資源調度、可用性及穩定性上作了持續改進,已被愈來愈多企業使用java

 做爲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等

 

http://luoshi0801.iteye.com/blog/2168848

相關文章
相關標籤/搜索