1、什麼是Stormjava
Strom是由Twitter開源的相似於Hadoop的實時數據處理框架。Strom是分佈式流式數據處理系統,強大的分佈式集羣管理、便捷的針對流式數據的編程模型、高容錯保障這些都是其成爲流式實時數據處理的首選。web
2、Storm特色與優點 數據庫
1)易用:爲複雜的流計算模型提供了豐富的服務和編程接口,開發迅速、容易上手學習使用。(開發迅速,容易上手)編程
2)容錯:具備適應性的容錯能力。當工做進程(worker)失敗時,Storm能夠自動重啓這些進程;當一個節點宕機時,上面的全部工做進程都會在其餘的節點從新被啓動;對於Storm的守護進程,nimbus和supervisor被設計爲無狀態或快速恢復。(守護進程無狀態,worker故障切換)api
3)擴展性:storm做業本質具備並行性,能夠跨機器或集羣來執行。Topology中各個不一樣的組件(Spout和Bolt)能夠配置爲不一樣的並行度。當集羣性能不足時,能夠隨時增長物理機對並行任務作balance。(線性擴展)數組
4)完整性:對數據提供完整性操做:至少處理一次、至多處理一次、處理且僅處理一次。用戶可根據本身的需求進行選擇。(數據不丟失,準確性)瀏覽器
3、Storm的應用場景服務器
目前Storm的使用很是普遍了,在Twitter、Yahoo、騰訊、阿里、新浪等著名公司。併發
新浪的實時分析平臺負載均衡
騰訊的實時計算平臺
奇虎360的實時平臺
百度的實時系統
阿里的Jstorm
......
4、Storm的系統構架
一、主節點(Nimbus):運行Nimbus的節點是系統的Master節點,即主節點;Nimbus進程是Storm系統的中心,負責接收用戶提交的做業(Storm中即爲以jar包形式保存的topology代碼),向工做節點分配任務(進程級和線程級)和傳輸做業副本;並依賴協調節點的服務監控集羣的運行狀態,提供狀態獲取端口。Nimbus目前是單獨部署的。
二、從節點(Supervisor):運行supervisor的節點是從節點,即工做節點;supervisor監聽所在節點,根據nimbus的委派,啓動、中止、撤銷或關閉任務的工做進程。工做節點是實時數據處理做業運行的節點。其中、計算在節點上的物理單元是worker,即工做進程;計算的邏輯單元是executor,即計算線程。計算的做業邏輯單元是topology,即拓撲;計算的任務邏輯單元是task,即任務。每一個worker執行特定的topology的executor子集,每一個executor執行一個或多個task。一個topology主要有兩種組件:spout和bolt,分別是流式數據在topology中的起始單元和處理單元。組件能夠並行配置,並行的每一份就是一個task,在一個executor中運行。
三、Web節點(Storm UI): 運行Storm UI後臺服務的節點;Storm UI在指定端口提供網頁服務。用戶能夠根據瀏覽器訪問web頁面,經過web頁面提交、暫停和撤銷做業,也能夠以只讀的方式獲取系統配置、做業以及各個組件的運行狀態。web節點在邏輯 上是獨立的,能夠被安裝在系統的任意節點實現監控;可是若是須要實現做業的管理,Storm UI必須和Storm nimbus部署在一臺機器上,這是由於Storm UI進程會檢查本機是否存在nimbus的鏈接,是否存在可致使UI部分功能沒法正常工做。
四、協調節點(Zookeeper):運行Zookeeper進程的節點;Zookeeper並非Storm專用的,能夠做爲一類通用的分佈式狀態協調服務。nimbus和supervisor之間的全部協調,包括分佈式狀態維護和分佈式配置管理都是經過協調節點實現的。爲了實現服務的高可用性,Zookeeper每每是以集羣形式提供服務的,即在Storm系統中能夠存在多個協調節點。
5、Storm的工做流
一、Topology:storm中運行的一個實時應用程序,由於每一個組件間的消息流動造成邏輯上的一個拓撲結構。
二、Spout:在一個topology中產生源數據流的組件。一般狀況下spout會從外部數據源中讀取數據,而後轉化爲topology內部的源數據。Spout是一個主動的角色,其接口中有一個nextTuple()函數,storm框架會不停地調用此函數,用戶只要在其中生成源數據便可。
三、Bolt:是在一個topology中接受數據而後執行處理的組件。Bolt能夠執行過濾、函數操做、合併、寫數據庫等操做。Bolt是一個被動的角色,其接口中有execute(Tuple input)函數,在接受到消息後會調用此函數,用戶能夠在其中執行本身想要的操做。
四、Tuple:一次消息傳遞的基本單元。本應該是一個key-value的map,可是因爲各個組件間傳遞的tuple的字段名稱已經事先定義好,因此tuple中只要按序填入各個value就好了,因此就是一個value list。
五、Stream:源源不斷傳遞的tuple就組成了stream。
6、Storm的併發機制
一、服務器(Nodes):Strom集羣能夠包含多臺服務器,便可以擴展多個Nodes.
二、JVM虛擬機(worker):每臺Storm服務器能夠起多個JVM虛擬機,便可以擴展爲多個worker。
三、線程(executor):每一個worker能夠運行一個或多個executor。每一個executor能夠運行同一個component(spout/bolt)的一個或多個task。
四、Spout/Bolt實例(task):task就是一個spout/bolt實例,是真正執行數據處理的地方。
一個正在運行的拓撲由不少worker進程組成,這些worker進程在storm集羣的多臺機器上運行。一個worker進程屬於一個特定的拓撲而且執行這個拓撲的一個或多個component(spout/bolt)的一個或多個executor。一個worker進程就是一個java虛擬機(JVM),它執行一個拓撲的一個子集。
一個executor是由一個worker進程產生的一個線程,它運行在worker的java虛擬機裏。一個executor爲同一component
(spout/bolt)運行一個或多個任務。一個executor總會有一個線程來運行executor全部的task,這說明task在executor內部是串行執行的。
真正的數據處理是在task裏面執行的,在父executor線程執行過程當中會運用task。在代碼中實現每一個spout或bolt是在全集羣中以不少task的形式運行的。一個component的task數量在這拓撲的生命週期是固定不變的,可是一個component的executor(線程)數量是隨着時間推移發生變化的。說明:threads數量<=task數量。默認狀況下task數量被設置成跟executor的數量是同樣的,即Storm會在每一個線程上執行一個任務。
注意:executor線程的數量在拓撲已經啓動後能夠發生變化,可是拓撲的task數量是固定不變的了。
7、Storm的數據流
Storm的核心概念是「流」(stream),一個stream至關於一個無限的元組(tuple)序列。Storm提供基用來作流轉換的基件是spout和bolt。spout和bolt提供了接口,能夠實現這些接口來處理應用程序相關的邏輯。
spout是流的來源。例如:spout能夠從一個Kestrel隊列來讀tuple而且發射(emit)他們從而造成一個流,或者spout能夠鏈接到twitter api來發射一個推文的流。
一個bolt消費任意數量的流,作一些處理,而後可能會發射出新的流。對於複雜的流轉換,例如:從一個推文的流計算出一個熱門話題的流須要多個步驟、多個bolt。bolt能夠經過運行函數來作任何事,如、過濾元組、作流聚合、作流鏈接、和數據庫之間交互等。
storm使用tuple作數據模型。一個tuple是一個被命名過的值列表,一個tuple中的字段能夠是任何類型的對象。是開箱即便用的,storm支持全部的簡單數據類型,如字符串、字節數組做爲tuple的字段值。若是使用另一種類型的對象,只須要爲這個類型實現一個serializer。topology中的每個節點都應該爲它要發射的元組輸出字段。
爲拓撲中的每個bolt肯定輸入數據流定義一個拓撲的重要環節。數據流分組定義了在bolt的不一樣任務(tasks)中劃分數據流的方式。在storm中有八種內置的數據流分組方式,並且能夠經過customstreamgrouping接口實現自定義的數據流分組模型。
八組數據流分方式
一、隨機分組(shuffle grouping):這種方式下元組會被儘量的隨機地分配到bolt的不一樣任務(tasks)中,使得每一個任務所處理的元組數量可以保持基本一致,以確保集羣的負載均衡。
二、域分組(fields grouping):數據流根據定義的「域」來分組。如:若某個數據流是基於一個名爲「user-id」的域進行劃分的,那麼全部包含相同「user-id」的元組都會被分配到同一個任務中,這樣來確保消息的一致性。
三、部分關鍵字分組(partial key grouping):這種方式與域分組相似,根據定義的域來對數據流進行分組,不一樣的是,這種分組方式會考慮下游bolt數據處理的均衡性問題,再輸入數據源關鍵字不平衡時會有更好的性能。
四、徹底分組(all grouping):這種方式會將數據流同時發送到bolt的全部任務中(即同一個元組會被複制多份而後發送到全部的任務處理)。使用這種方式要格外謹慎。
五、全局分組(global grouping):這種方式下全部的數據流都被髮送到bolt的同一個任務中,也就是id最小的那個任務。
六、非分組(none grouping):不關心數據流如何分組,目前這種方式的結果和隨機分組徹底等效,不過在將來storm社區可能考慮經過非分組方式來讓bolt和它所訂閱的spout或bolt在同一個線程中執行。
七、直接分組(direct grouping):是一種特殊的分組方式,這種方式使得元組的發送者能夠指定下游的哪一個任務能夠接收這個元組
。只有在數據流被聲明爲直接數據流時才能使用直接分組。
八、本地或隨機分組(local or shuffle grouping):若是在源組件的worker進程裏目標有一個或更多的任務線程,元組會被隨機分配到那些同進程的任務中。
7、Storm的數據流
一、更能性保障:多粒度的並行化
二、非功能性保障:多級別的可靠性