storm介紹node
全量數據處理使用的大可能是鼎鼎大名的hadoop或者hive,做爲一個批處理系統,hadoop以其吞吐量大、自動容錯等優勢,在海量數據處理上獲得了普遍的使用。可是,hadoop不擅長實時計算,由於它自然就是爲批處理而生的。storm區別於hadoop,在Storm中,一個實時應用的計算任務被打包做爲Topology發佈,這同Hadoop的MapReduce任務類似。可是有一點不一樣的是:在Hadoop中,MapReduce任務最終會執行完成後結束;而在Storm中,Topology任務一旦提交後永遠不會結束,除非你顯示去中止任務,用在實時的流式計算中,被普遍用來進行實時日誌處理、實時統計、實時風控等場景,固然也能夠用在對數據進行實時初步的加工,存儲到分佈式數據庫中如HBase,便於後續的查詢。面對的大批量的數據的實時計算,storm實現了一個可擴展的、低延遲、可靠性和容錯的分佈式計算平臺。web
storm組件數據庫
Storm集羣主要由一個主節點和一羣工做節點(worker node)組成,經過 Zookeeper進行協調。
主節點:
主節點一般運行一個後臺程序 —— Nimbus,主控節點,負責在集羣中發佈代碼,分配工做給機器,而且監聽狀態。
工做節點:
工做節點一樣會運行一個後臺程序 —— Supervisor,用於收聽工做指派並基於要求運行工做進程。每一個工做節點都是topology中一個子集的實現。而Nimbus和Supervisor之間的協調則經過Zookeeper系統或者集羣。
Zookeeper:
Zookeeper是完成Supervisor和Nimbus之間協調的服務。Nimbus的守護進程和Supervisors守護進程是沒法鏈接和無狀態的;全部的狀態維持在Zookeeper中 或保存在本地磁盤上。這意味着你能夠 kill -9 Nimbus 或Supervisors 進程,因此他們不須要作備份。這種設計致使Storm集羣具備使人難以置信的穩定性。而應用程序實現實時的邏輯則被封裝進Storm中的「topology」。topology則是一組由Spouts(數據源)和Bolts(數據操做)經過Stream Groupings進行鏈接的圖。
下面對出現的術語進行更深入的解析。
Spout:
簡而言之,Spout歷來源處讀取數據並放入topology。Spout分紅可靠和不可靠兩種;當Storm接收失敗時,可靠的Spout會對tuple(元組,數據項組成的列表)進行重發;而不可靠的Spout不會考慮接收成功與否只發射一次。而Spout中最主要的方法就是nextTuple(),該方法會發射一個新的tuple到topology,若是沒有新tuple發射則會簡單的返回。
Bolt:
Topology中全部的處理都由Bolt完成。Bolt能夠完成任何事,好比:鏈接的過濾、聚合、訪問文件/數據庫、等等。Bolt從Spout中接收數據並進行處理,若是遇到複雜流的處理也可能將tuple發送給另外一個Bolt進行處理。而Bolt中最重要的方法是execute(),以新的tuple做爲參數接收。不論是Spout仍是Bolt,若是將tuple發射成多個流,這些流均可以經過declareStream()來聲明。
Stream Groupings:
Stream Grouping定義了一個流在Bolt任務間該如何被切分。這裏有Storm提供的6個Stream Grouping類型:
1. 隨機分組(Shuffle grouping):隨機分發tuple到Bolt的任務,保證每一個任務得到相等數量的tuple。
2. 字段分組(Fields grouping):根據指定字段分割數據流,並分組。例如,根據「user-id」字段,相同「user-id」的元組老是分發到同一個任務,不一樣「user-id」的元組可能分發到不一樣的任務。
3. 所有分組(All grouping):tuple被複制到bolt的全部任務。這種類型須要謹慎使用。
4. 全局分組(Global grouping):所有流都分配到bolt的同一個任務。明確地說,是分配給ID最小的那個task。
5. 無分組(None grouping):你不須要關心流是如何分組。目前,無分組等效於隨機分組。但最終,Storm將把無分組的Bolts放到Bolts或Spouts訂閱它們的同一線程去執行(若是可能)。
6. 直接分組(Direct grouping):這是一個特別的分組類型。元組生產者決定tuple由哪一個元組處理者任務接收。
固然還能夠實現CustomStreamGroupimg接口來定製本身須要的分組。架構
storm流程socket
Storm是一個分佈式的,可靠的,容錯的數據流處理系統。它會把工做任務委託給不一樣類型的組件,每一個組件負責處理一項簡單特定的任務。Storm集羣的輸入流由一個被稱做spout的組件管理,spout把數據傳遞給bolt, bolt要麼把數據保存到某種存儲器,要麼把數據傳遞給其它的bolt。你能夠想象一下,一個Storm集羣就是在一連串的bolt之間轉換spout傳過來的數據。
這裏用一個簡單的例子來講明這個概念。昨晚我在新聞節目裏看到主持人在談論政治人物和他們對於各類政治話題的立場。他們一直重複着不一樣的名字,而我開始考慮這些名字是否被提到了相同的次數,以及不一樣次數之間的誤差。
想像播音員讀的字幕做爲你的數據輸入流。你能夠用一個spout讀取一個文件(或者socket,經過HTTP,或者別的方法)。文本行被spout傳給一個bolt,再被bolt按單詞切割。單詞流又被傳給另外一個bolt,在這裏每一個單詞與一張政治人名列表比較。每遇到一個匹配的名字,第二個bolt爲這個名字在數據庫的計數加1。你能夠隨時查詢數據庫查看結果, 並且這些計數是隨着數據到達實時更新的。全部組件(spouts和bolts)及它們之間的關係請參考拓撲圖1-1分佈式
storm架構圖oop
storm拓撲圖spa
storm總體架構圖線程
storm做業架構圖設計