跟我一塊兒雲計算(1)——storm

概述

最近要作一個實時分析的項目,因此須要深刻一下storm。java

爲何storm

綜合下來,有如下幾點:python

1. 生逢其時git

MapReduce 計算模型打開了分佈式計算的另外一扇大門,極大的下降了實現分佈式計算的門檻。有了MapReduce架構的支持,開發者只須要把注意力集中在如何使用 MapReduce的語義來解決具體的業務邏輯,而不用頭疼諸如容錯,可擴展性,可靠性等一系列硬骨頭。一時間,人們拿着MapReduce這把榔頭去敲 各類各樣的釘子,天然而然的也試圖用MapReduce計算模型來解決流處理想要解決的問題。各類失敗的嘗試以後,人們意識到,改良MapReduce並 不能使之適應於流處理的場景,必須發展出全新的架構來完成這一任務(MapReduce不適合作流處理的緣由Yahoo!在其S4的介紹論文裏面有比較詳 細的闡述,而UCBerkeley的SparkStreaming項目如今正在嘗試挑戰這一結論,感興趣的同志請自行查看)。另外一方面,人們對傳統的 CEP解決方案心存疑慮,認爲其非分佈式的架構可擴展性不夠,沒法scaleout來知足海量的數據處理要求。這時候,Yahoo!的S4以及 Twitter的Storm恰到好處的撓到了人們的癢處。github

2. 可擴展性編程

更加明確的說,是scaleout的能力。所謂Scale out (http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_.28scale_out.29), 簡單來講就是當一個集羣的處理能力不夠用的時候,只要往裏面再追加一些新的節點,計算有能力遷移到這些新的節點來知足須要。可能的狀況下,選擇 Scaleout 而非Scale up,這個觀念已經深刻人心。通常來講,實現Scaleout的關鍵是Shared nothing architecture,即計算所須要的各類狀態都是自知足的,不存在對特定節點強依賴,這樣,計算就能夠很容易的在節點間遷移,整個系統計算能力不夠 用的時候,加入新的節點就能夠了。Storm的計算模型自己是Scaleout友好的,Topology 對應的Spout和Bolt並不須要和特定節點綁定,能夠很容易的分佈在多個節點上。此外,Storm還提供了一個很是強大的命令 (rebalance),能夠動態調整特定Topology中各組成元素(Spout/Bolt)的數量以及其和實際計算節點的對應關係。ruby

3. 系統可靠性架構

Storm 這個分佈式流計算框架是創建在Zookeeper的基礎上的,大量系統運行狀態的元信息都序列化在Zookeeper中。這樣,當某一個節點出錯時,對應 的關鍵狀態信息並不會丟失,換言之Zookeeper的高可用保證了Storm的高可用。文檔(https://github.com /nathanmarz/storm/wiki/Fault-tolerance)討論了Storm各個子系統的錯誤冗餘行爲,能夠進一步參考。框架

4. 計算的可靠性jvm

分 布式計算涉及到多節點/進程之間的通訊和依賴,正確的維護全部參與者的狀態和依賴關係,是一件很是有挑戰性的任務。Storm實現了一整套機制,確保消息 會被完整處理(https://github.com/nathanmarz/storm/wiki/Guaranteeing-message- processing)。 此外,經過TransactionalTopology(https://github.com/nathanmarz/storm/wiki /Transactional-topologies) ,Storm能夠保證每一個tuple「被且僅被處理一次」。maven

5. Opensource

這個就不用多說了,開源使得Storm社區及其活躍,到本文寫做的時候,Storm已經發展到了0.81,Storm的使用者已經有了一個長長的名單(https://github.com/nathanmarz/storm/wiki/Powered-By),其中不乏好比淘寶,支付寶,Twitter,Groupon這種互聯網巨頭。

6. Clojure基礎上的實現

Storm的核心代碼是Clojure和Java。Clojure是一門JVM基礎上的函數式編程語言(http://clojure.org/), 是支持STM(SoftwareTransactional Memory)的少數幾門語言之一。Clojure推出以來,獲得了普遍關注,人們廣泛認爲,其函數式編程所具備的各類特性能在分佈式環境中大有用武之 地, 而Storm則給出了一個很好的實例。從另外一個角度來講,Storm也能大大的推進Clojure的普及。

總言之,時勢造英雄,Storm在正確的時間出如今了正確的地點,並且剛恰好作了正確的事情,想不紅都沒有道理。

高層架構

從高來看storm的架構:

S3.jpg

指南

在這個指南中,你將學到如何建立strom架構和部署它的集羣。Java將是示例中用到的主要語言,在其它的一些示例中將使用python來描述strom支持多語言的能力。

先安裝strom,能夠參考:

http://my.oschina.net/leejun2005/blog/147607?from=20130804

上面的文章裏面已經描述的很清楚了。

能夠先從示例storm-starter開始學習strom。

地址是:

https://github.com/nathanmarz/storm-starter

先決條件

你須要安裝git和java而後設置這個用戶的環境變量。另外還有兩個示例須要安裝python和ruby。

而後建立新目錄下載storm-starter

$ git clone git://github.com/nathanmarz/storm-starter.git && cd storm-starter

storm-starter概述

storm-starter包含不少使用storm的示例。若是你第一次使用storm,首先了解一下它的架構:

  1. ExclamationTopology: Java編寫的基本示例
  2. WordCountTopology: 和python一塊兒使用的例子
  3. ReachTopology: 複雜的DRPC的例子

當你熟悉了上面的示例以後,能夠在in src/jvm/storm/starter/ 下例如RollingTopWords 去熟悉一些更高級的實現。

若是你要學習更多的示例,能夠到Storm project page.

使用storm-starter

使用storm-starter有多種方式,可使用Leiningen或者maven。這裏使用maven。

首先編譯:

mvn -f m2-pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCountTopology

而後打包:

mvn -f m2-pom.xml package

運行測試:

mvn -f m2-pom.xml test

而後就是把打包的jar包發送到storm裏運行了。

正在討論的架構

下面就是咱們正在處理的項目中使用的架構,還在討論階段,也但願對這個有看法的童鞋發表一下本身的觀點:

實時查詢架構

古有「即生瑜,何生亮」,不過我以爲若是沒有瑜和亮,可能誰都沒法戰勝曹操,和如今的架構一下,若是不是把流框架storm和任務處理框架hadoop結合起來,也許處理實時的大數據真的很難!

相關文章
相關標籤/搜索