1.概述
JStorm 是一個類似於 Hadoop 的MapReduce的計算系統,它是由Alibaba開源的實時計算模型,它使用Java重寫了原生的Storm模型(Clojure和Java混合編寫的),並且再原來的基礎上做了許多改進。用戶只需按照指定的接口實現一個任務,然后將這個任務提交給JStorm系統,JStorm在接受了任務指令后,會無間斷運行任務,一旦出現異常導致某個Worker發送故障,調度器立刻會分配一個新的Worker去頂替異常的Worker。下面是本次分享的目錄結構:
- 應用場景
- 基本術語
- JStorm比較
- JStorm架構
- 總結
下面開始今天的內容分享。
2.應用場景
從應用的角度來說,JStorm它是一種分布式的應用;從系統層面來說,它又類似於MapReduce這樣的調度系統;而從數據方面來說,它又是一種基於流水數據的實時處理解決方案。如今,DT時代的當下,用戶和企業也不僅僅只滿足於離線數據,對於數據的實時性要求也越來越高了。
在早期,Storm和JStorm未問世之前,業界有很多實時計算系統,可謂百家爭鳴,自Storm和JStorm出世之后,基本這兩者占據主要地位,原因如下:
- 易開發:接口簡單,上手容易,只需要按照Spout,Bolt以及Topology的編程規范即可開發一個擴展性良好的應用,底層的細節我們可以不用去深究其原因。
- 擴展性:可線性擴展性能。
- 容錯:當Worker異常或掛起,會自動分配新的Worker去工作。
- 數據精准:其包含Ack機制,規避了數據丟失的風險。使用事物機制,提高數據精度。
JStorm處理數據的方式流程是基於流式處理,因此,我們會用它做以下處理:
- 日志分析:從收集的日志當中,統計出特定的數據結果,並將統計后的結果持久化到外界存儲介質中,如:DB。當下,實時統計主流使用JStorm和Storm。
- 消息轉移:將接受的消息進行Filter后,定向的存儲到另外的消息中間件中。
3.基本術語
3.1 Stream
在JStorm當中,有對Stream的抽象,它是一個不間斷的無界的連續Tuple,而JStorm在建模事件流時,把流中的事件抽象未Tuple,流程如下圖所示:
3.2 Spout和Bolt
在JStorm中,它認為每個Stream都有一個Stream的來源,即Tuple的源頭,所以它將這個源頭抽象為Spout,而Spout可能是一個消息中間件,如:MQ,Kafka等。並不斷的發出消息,也可能是從某個隊列中不斷讀取隊列的元數據。
在有了Spout后,接下來如何去處理相關內容,以類似的思想,將JStorm的處理過程抽象為Bolt,Bolt可以消費任意數量的輸入流,只要將流方向導到該Bolt即可,同時,它也可以發送新的流給其他的Bolt使用,因而,我們只需要開啟特定的Spout,將Spout流出的Tuple導向特定的Bolt,然后Bolt對導入的流做處理后再導向其它的Bolt等。
那么,通過上述描述,其實,我們可以用一個形象的比喻來理解這個流程。我們可以認為Spout就是一個個的水龍頭,並且每個水龍頭中的水是不同的,我們想要消費那種水就去開啟對應的水龍頭,然后使用管道將水龍頭中的水導向一個水處理器,即Bolt,水處理器處理完后會再使用管道導向到另外的處理器或者落地到存儲介質。流程如下圖所示:
3.3 Topology
如圖所示,這是一個有向無環圖,JStorm將這個圖抽象為Topology,它是JStorm中最高層次的一個抽象概念,它可以處理代碼層面當中直接於JStorm打交道的,可以被提交到JStorm集群執行對應的任務,一個Topology即為一個數據流轉換圖,圖中的每個節點是一個Spout或者Bolt,當Spout或Bolt發送Tuple到流時,它就發送Tuple到每個訂閱了該流的Bolt上。
3.4 Tuple
JStorm當中將Stream中數據抽象為了Tuple,一個Tuple就是一個Value List,List值的每個Value都有一個Name,並且該Value可以是基本類型,字符類型,字節數組等,當然也可以是其它可序列化的類型。Topology的每個節點都要說明它所發射出的Tuple的字段的Name,其它節點只需要訂閱該Name就可以接收處理相應的內容。
3.5 Worker和Task
Work和Task在JStorm中的職責是一個執行單元,一個Worker表示一個進程,一個Task表示一個線程,一個Worker可以運行多個Task。而Worker可以通過setNumWorkers(int workers)方法來設置對應的數目,表示這個Topology運行在多個JVM(PS:一個JVM為一個進程,即一個Worker);另外setSpout(String id, IRichSpout spout, Number parallelism_hint)和setBolt(String id, IRichBolt bolt,Number parallelism_hint)方法中的參數parallelism_hint代表這樣一個Spout或Bolt有多少個實例,即對應多少個線程,一個實例對應一個線程。
3.6 Slot
在JStorm當中,Slot的類型分為四種,他們分別是:CPU,Memory,Disk,Port;與Storm有所區別(Storm局限於Port)。一個Supervisor可以提供的對象有:CPU Slot、Memory Slot、Disk Slot以及Port Slot。
- 在JStorm中,一個Worker消耗一個Port Slot,默認一個Task會消耗一個CPU Slot和一個Memory Slot
- 在Task執行較多的任務時,可以申請更多的CPU Slot
- 在Task需要更多的內存時,可以申請更多的額Memory Slot
- 在Task磁盤IO較多時,可以申請Disk Slot
4.JStorm比較
當前JStorm已經更新到2.x版本了,較於Storm而言,JStorm在一個Nimbus宕機后,會自動的熱切到備份的Nimbus,實現了HA特性。對比與其它的數據產品而言,如下所示:
- Flume:一個成熟的產品,目前很多企業的日志收集系統均基於此套件開發,可以將數據收集后做一些計算與分析。
- S4:它是一個通用的,可擴展的,分布式的,容錯,可插拔的平台,使程序員可以很容易地開發用於處理無界的連續數據流應用。數據准確性較差,數據丟失的風險無法規避,導致其發展不是很迅速,社區活躍度不夠高。
- AKKA:一個Actor模型,系統模型強大,可以做任何你想做的時,當時很多工作都需要自己親自動手去實現,如序列化、Topology的生成等。
- Spark:基於內存計算的MapReduce模型,偏重於數據批量處理。
5.JStorm架構
從設計層面來說,JStorm是一個典型的調度系統。在這個系統中,有以下內容:
角色 | 作用 |
Nimbus | 調度器 |
Supervisor | Worker的代理角色,負責Kill掉Worker和運行Worker |
Worker | Task的容器 |
Task | 任務的執行者 |
ZooKeeper | 系統的協調者 |
其整體架構圖,如下所示:
6.總結
本篇博客給大家分享了JStorm的相關內容,其中包含一些基本概念,與Storm的區別,它的架構圖等內容,后續會大家介紹如何去部署JStorm的相關內容,以及它的編程方式,API的用法等內容會用一些案例給大家去一一的贅述。
7.結束語
這篇博客就和大家分享到這里,如果大家在研究學習的過程當中有什么問題,可以加群進行討論或發送郵件給我,我會盡我所能為您解答,與君共勉!