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