來自阿里的流處理框架:JStorm
關于流處理框架,在先前的文章匯總已經介紹過Strom, 今天學習的是來自阿里的的流處理框架JStorm。簡單的概述Storm就是:JStorm 比Storm更穩定,更強大,更快,Storm上跑的程序,一行代碼不變可以運行在JStorm上。直白的將JStorm是阿里巴巴的團隊基于Storm 的二次開發產物,相當于他們的Tengine是基于Ngix開發的一樣。以下為阿里巴巴團隊放棄直接使用Storm選擇自行開發JStorm的原因:
阿里擁有自己的實時計算引擎
- 類似于hadoop 中的MR
- 開源storm響應太慢
- 開源社區的速度完全跟不上Ali的需求
- 降低未來運維成本
- 提供更多技術支持,加快內部業務響應速度
現有Storm無法滿足一些需求
- 現有storm調度太簡單粗暴,無法定制化
- Storm 任務分配不平衡
- RPC OOM一直沒有解決
- 監控太簡單
- 對ZK 訪問頻繁
JStorm相比Storm更穩定
- Nimbus 實現HA:當一臺nimbus掛了,自動熱切到備份nimbus
- 原生Storm RPC:Zeromq 使用堆外內存,導致OS 內存不夠,Netty 導致OOM;JStorm底層RPC 采用netty + disruptor保證發送速度和接受速度是匹配的
- 新上線的任務不會沖擊老的任務:新調度從cpu,memory,disk,net 四個角度對任務進行分配,已經分配好的新任務,無需去搶占老任務的cpu,memory,disk和net
- Supervisor主線
- Spout/Bolt 的open/prepar
- 所有IO, 序列化,反序列化
- 減少對ZK的訪問量:去掉大量無用的watch;task的心跳時間延長一倍;Task心跳檢測無需全ZK掃描。
JStorm相比Storm調度更強大
- 徹底解決了storm 任務分配不均衡問題
- 從4個維度進行任務分配:CPU、Memory、Disk、Net
- 默認一個task,一個cpu slot。當task消耗更多的cpu時,可以申請更多cpu slot
- 默認一個task,一個memory slot。當task需要更多內存時,可以申請更多內存slot
- 默認task,不申請disk slot。當task 磁盤IO較重時,可以申請disk slot
- 可以強制某個component的task 運行在不同的節點上
- 可以強制topology運行在單獨一個節點上
- 可以自定義任務分配,提前預約任務分配到哪臺機器上,哪個端口,多少個cpu slot,多少內存,是否申請磁盤
- 可以預約上一次成功運行時的任務分配,上次task分配了什么資源,這次還是使用這些資源
JStorm相比Storm性能更好
JStorm 0.9.0 性能非常的好,使用netty時單worker 發送最大速度為11萬QPS,使用zeromq時,最大速度為12萬QPS。
- JStorm 0.9.0 在使用Netty的情況下,比Storm 0.9.0 使用netty情況下,快10%, 并且JStorm netty是穩定的而Storm 的Netty是不穩定的
- 在使用ZeroMQ的情況下, JStorm 0.9.0 比Storm 0.9.0 快30%
性能提升的原因:
- Zeromq 減少一次內存拷貝
- 增加反序列化線程
- 重寫采樣代碼,大幅減少采樣影響
- 優化ack代碼
- 優化緩沖map性能
- Java 比clojure更底層
JStorm的其他優化點
- 資源隔離。不同部門,使用不同的組名,每個組有自己的Quato;不同組的資源隔離;采用cgroups 硬隔離
- Classloader。解決應用的類和Jstorm的類發生沖突,應用的類在自己的類空間中
- Task 內部異步化。Worker 內部全流水線模式,Spout nextTuple和ack/fail運行在不同線程
參考鏈接:https://github.com/alibaba/jstorm/
</div> 引用地址:http://www.biaodianfu.com/jstorm.html
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!