storm原理

MapReduce,Hadoop及其相關技術以難以想象的程度來進行大規模存儲和處理,可是這些處理技術不夠實時,Hadoop 系統也沒法變成一個實時系統,由於實時數據處理系統需求是徹底不一樣於批處理系統的。 可是業務需求卻須要大規模實時數據處理,因此 Hadoop 就成爲了數據處理生態系統中最大的一個短板。而Storm就彌補了這一不足。之前是人工創建網絡隊列和 worker 實時處理過程,因此存在嚴重的不足,好比數據隊列冗長、系統易崩潰,也不適合大規模處理。如今 Storm極大地擴充了用例集、規模化、容錯、數據不丟失等等特性,處理速度是很是快的。 Nimbus 是經過 zookeeper 來傳遞信息的,也就是 zookeeper 在 nimbus 和 worker 之間創建了協調關係,因此對於 Strom 來講,zookeeper 相當重要。java

早在 storm.yaml 配置中,咱們定義supervisor.slots.ports: 有4個端口,這就是 worker 的工做端口,一個 supervisor 有4個 worker 端口。 節點有兩個: master 節點、 worker 節點。master節點運行 Nimbus服務,worker 節點運行 Supervisor服務。 Nimbus 的做用:負責集羣上的代碼分配; 機器上的任務分配;監控失效數據 Supervisor 的做用:監聽分配的工做;啓動、中止worker進程。每個 worker 進程就是運行一個 topology 的子集;一個 正在運行的topology分佈在集羣上每一個機器上運行的如圖2所示。正在運行的topology你能夠經過 UI web端查看到。 2、Topology 拓撲 Topology是 Storm中很重要的概念,這是處理實時計算的核心概念。一個 Topology就是一個計算的拓撲圖,就是計算的路徑和節點構成,並且這個圖仍是封閉的喲!不會自動計算完畢的,你得使用 Storm kill 來殺掉這個執行的Topology。Topology就包含了處理邏輯,節點間的鏈接,也就是節點間的數據是怎麼傳遞的。 這個是運行的Topology: $ storm jar storm-starter-1.1.0.jar org.apache.storm.starter.ExclamationTopology ExclamationTopology 3、Streams 數據流 Storm 中核心抽象概念就是 Stream, 數據流就是大量的一系列的tuples(元組)。Storm 用基元(primitives)以一種分佈式的、可靠的方式將一個數據流轉換成一個新的數據流。 好比,將一個微博數據流變換一個熱門話題數據流。 Storm 中提供的數據流轉換基元就是 spout 和 bolt。spout 和 bolt 提供了對應的接口,實現這個接口就能夠運行特定應用的邏輯。 一個 spout就是一個數據流的源,例如,能夠從 Kestrel(storm-kestrel 開源)隊列中彈出的元組做爲一個 spout,並能夠將它們做爲一個數據流。還有一個 spout能夠調用 Twitter API 獲得一個微博數據流。下面的一個圖就代表了從一個源頭取tuple元組造成一個 spout !就是從外部數據源(隊列、數據庫等)中讀取數據,封裝成元組,造成數據流。web

bolt 是用來處理數據裏的,能夠對一些數據流(不僅一個數據流)進行處理,可能會產生新的數據流。對一些複雜的數據流變換,好比從一個微博流中計算一個熱門話題流,就須要不少步驟,所以就有多個 bolt。所以 bolt 中就有不少處理,好比運行函數,作流式聚合,流式連接,訪問數據庫等等。bolts 就以下圖所示。數據庫

從以上能夠看出, spout 是一個 stream 的源, 而 bolt 倒是處理輸入的 streams,來產生新的 streams。注意,spout 和 bolt 只不過是流發生器而已。 spout 和 bolt組成的網絡就是拓撲圖Topology,以下圖所示。Topology就是最高層的邏輯抽象,能夠直接送到 Storm 集羣去執行。一個Topology圖就是流式轉換,每一個節點是 spout 或者 bolt。圖中的每條邊就是 bolt 訂閱了流,當一個 spout或者 bolt 產生一個元組到一個流時,它就發送元組到訂閱了流的每一個 bolt。apache

topology裏面的每個節點都是並行運行的。能夠指定每一個節點的並行度, storm則會在集羣裏面分配大量的線程計算。 一個topology會一直運行,直到你kill 掉它。storm能自動從新分配一些運行失敗的任務, 而且storm保證不會有數據丟失, 即便一些機器意外停機而且消息被丟掉的狀況下。 4、數據模型 storm使用元組tuple來做爲它的數據模型。每一個tuple是一堆值,每一個值有一個名字,而且每一個值能夠是任何類型, 在個人理解裏面一個tuple能夠看做一個沒有方法的java對象。整體來看,storm支持全部的基本類型、字符串以及字節數組做爲tuple的值類型。你也可使用你本身定義的類型來做爲值類型, 只要你實現對應的序列化器(serializer)。 一個Tuple表明數據流中的一個基本的處理單元,例如一條cookie日誌,它能夠包含多個Field,每一個Field表示一個屬性。數組

Tuple原本應該是一個Key-Value的Map,因爲各個組件間傳遞的tuple的字段名稱已經事先定義好了,因此Tuple只須要按序填入各個Value,因此就是一個Value List。 一個沒有邊界的、源源不斷的、連續的Tuple序列就組成了Stream。cookie

topology裏面的每一個節點必須定義它要產生的tuple的每一個字段。 好比下面這個bolt定義它所產生的tuple包含兩個字段,類型分別是: double和triple。網絡

public class DoubleAndTripleBolt extends BaseRichBolt { private OutputCollectorBase _collector;分佈式

[@Override](https://my.oschina.net/u/1162528)
public void prepare(Map conf, TopologyContext context, OutputCollectorBase collector) {
    _collector = collector;
}

[@Override](https://my.oschina.net/u/1162528)
public void execute(Tuple input) {
    int val = input.getInteger(0);        
    _collector.emit(input, new Values(val*2, val*3));
    _collector.ack(input);
}

[@Override](https://my.oschina.net/u/1162528)
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("double", "triple"));
}

} declareOutputFields方法定義要輸出的字段 : ["double", "triple"]。這個bolt的其它部分咱們接下來會解釋。 以上參考http://www.javashuo.com/article/p-mjkurmao-eg.html Storm的examples文件夾下有不少案例,執行 集羣模式和本地模式的執行方式是不一樣的,看看如何執行。ide

相關文章
相關標籤/搜索