Apache Storm 是一個基於 Hadoop 的分散式串流運算框架,廣泛的應用於即時資料處理,像是 Twitter、淘寶等公司都使用 Storm 進行數據分析。究竟他有何特別之處呢,就讓我們透過簡單的說明,架設環境來體驗看看吧!
Storm 的架構
主要由 Nimbus,Supervisor 以及 ZooKeeper 這三個節點構成,下表與 Haddop 的架構做比較,懂過 Hadoop 再來看會更加清楚。
Hadoop | Storm | Storm 說明 | |
---|---|---|---|
系統角色 | JobTracker | Nimbus | 主節點,負責接收任務 Topology,並指派對應的 Spout/Bolt 元件執行 |
TaskTracker | Supervisor | 每個 Worker都會有一個Supervisor,用來管理 Worker 開始或停止 | |
ZooKeeper | 負責協調 Nimbus與ZooKeeper,監控所有節點的狀態,確保節點都能正常運作 | ||
Child | Worker | ||
任務名稱 | Job | Topology | 佈署完成後會持續運作,稱 Job比較像一次性任務,因此稱之為Topology |
運作方式 | Map-Reduce | Spout-Bolt |
在 Topology 之中,有兩個元件 Spout 與 Bolt,透過 Tuple 格式傳遞資料。Spout 負責接收資料,比如接收 Twitter 上的文字訊息,或是即時的股市資料 。而 Bolt 負責處理資料,可以自行定義每個 Bolt 的任務以及資料處理的路徑,最後將結果輸出或存放到資料庫。如下方的架構圖,多個資料來源可以同時接收並處理,也可以將資料分拆到不同的 Bolt 運算。
Spout-bolt 架構。圖 / Storm
佈署 Storm 的方式
佈署 Hadoop 相關應用已經不像以往土法煉鋼,要自己設定機器,擺上幾包乖乖以防不測。現在,雲端平台提供許多解決方案,能直接使用 Hadoop 生態系服務,省去環境建設的麻煩。大致有這三種方式:
- 使用雲端平台服務:Amazon EMR,Azure HDInsight,Google Cloud Dataproc
- 透過 Container 架設:Kubernetes, Docker Swarm, Docker Compose
- 從底層開始建置環境:使用多台實體/虛擬機器,依照官方的安裝步驟完成架設
首選當然是使用雲端平台,Azure 能直接架起來,網路上能找到 AWS 的架設腳本,而 Cloud Dataproc 似乎還沒有…
為了配合課程內容,這裡則是選擇使用 Kubernetes 的官方範本在 Google Container Engine 架設
使用 Docker-Compose 架設 Storm
由於 kubernetes 架設的 Storm 需要設定才能用 SSH 進 nimbus,想進主機看 Log 的話,可以用 Docker Compose 在單機建置環境。( wurstmeister 提供的 Storm 版本目前是 0.9.4 )
$ git clone https://github.com/wurstmeister/storm-docker.git
$ cd storm-docker
$ sudo docker-compose up –d
$ ./client.sh #Enter into nimbus server
直接執行 client.sh 就能進入 nimbus server,可以直接在裡面下達 Storm 指令
使用 Kubernetes 架設 Storm
架設方式很容易,可以直接到 Kubernetes 官方 Github 拉 Example,不過這個範例中沒有加入 Storm UI,所以推薦用這個範本 k8s-storm,裏頭已經寫好所有的 Script 了。如果像我一樣在 Google Cloud 上架設,記得給 nimbus 設定外部 IP,方便上傳 Job,修改方式如下 在 svc-storm-nimbus.yaml,加入 type: LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: nimbus
spec:
ports:
- port: 6627
selector:
app: nimbus
type: LoadBalancer
執行 start-all.sh 就能跑起來了!用 kubectl get services 檢查一下服務是不是都開啟,IP 有沒有成功設定
基本範例 ExclamationTopology
在執行前,先簡單說明 ExclamationTopology 這個範例,詳細的官方教學請看這裡。 這個範例就是在文字後面加驚嘆號,如下圖, Spout 會從五個字裏頭隨機挑一個不斷發送文字,經過 Bolt 後,在文字後方加入三個驚嘆號。整個流程是 Spout -> Bolt -> Bolt。
Spout 與 Bolt 的重要程式碼片段
透過 TopologyBuilder 完成設定。後方的數值代表 thread 的數量,物件則是透過 shuffleGrouping 連接。Grouping 表示數據分流與合併的方式,有很多總形式,詳情請看說明。
$ apt-get install maven
$ cd /opt/apache-storm-0.9.4/examples
mvn install
透過 maven,starter 範例會被包成 jar 檔,你會發現有 target 目錄下有一包 storm-starter-topologies-0.9.4.jar。我們用以下指令提交任務給 Kubernetes 上的 nimbus
$ cd target
$ storm jar storm-starter-topologies-0.9.4.jar storm.starter.ExclamationTopology -c nimbus.host= -c nimbus.thrift.port=6627
透過 Storm UI 看到剛剛上傳的 Topology 正常運作
執行 Topology 的 Log,你會發現文字加入驚嘆號囉 ! (nathan -> nathan!!! -> nathan!!!!!!)
看起來 在storm-starter 這包下面 /opt/apache-storm-0.9.4/examples/storm-starter/src/jvm/storm/starter 有個 WordCountTopology.java 可以拿來OEM 一下, 雖也有spout / bolt 等,但中間是用python 去split, 而且是固定幾個單字random 出來的,應該改改便可以套用到作業來使用!
另在按裝 apache-storm-0.9.4 時,因為版本之不同,可能需要進入下一層目錄,cd /opt/apache- storm-0.9.4/examples/storm-starter 再開始下mvn install 指令
然後安裝一個段落後,storm-starter-topologies-0.9.4.jar 可能不會在target 目錄中,您到上層找找也許會發現喔!
感謝你的補充^^
Good!
還有若有做好幾個storm constainer cluster 連結時, 記得先讓Google console 與Client 產生連繫,例如執行 gcloud container clusters get-credentials storm
–zone us-central1-a –project ccu0003 , 這樣在create spark or storm 的yaml/json 時就不會有錯誤訊息的出現!
另若其他同學再綁定外部ip之時,要注意svc-storm-nimbus.yaml 此檔案寫法,前面需些空白之類的,最好參考一下svc-storm-ui.yaml 的寫法,這樣變萬無一失了!
格式有時候會跑掉QQ, 我已經更新code的部分囉
讚!
寫的太清楚了! 讚
照老師講的跟振皓示範的做,真的會比較容易清楚且快完成說!