Storm 快速上手:概念、佈署與範例

Apache Storm 是一個基於 Hadoop 的分散式串流運算框架,廣泛的應用於即時資料處理,像是 Twitter、掏寶等公司都使用 Storm 進行數據分析。究竟他有何特別之處呢,就讓我們透過簡單的說明,架設環境來體驗看看吧!


Storm 的架構

主要由 NimbusSupervisor 以及 ZooKeeper 這三個節點構成,下表與 Haddop 的架構做比較,懂過 Hadoop 再來看會更加清楚。

HadoopStormStorm 說明
系統角色JobTrackerNimbus主節點,負責接收任務 Topology,並指派對應的 Spout/Bolt 元件執行
TaskTrackerSupervisor每個 Worker都會有一個Supervisor,用來管理 Worker 開始或停止
ZooKeeper負責協調 Nimbus與ZooKeeper,監控所有節點的狀態,確保節點都能正常運作
ChildWorker
任務名稱JobTopology佈署完成後會持續運作,稱 Job比較像一次性任務,因此稱之為Topology
運作方式Map-ReduceSpout-Bolt

在 Topology 之中,有兩個元件 Spout 與 Bolt,透過 Tuple 格式傳遞資料。Spout 負責接收資料,比如接收 Twitter 上的文字訊息,或是即時的股市資料 。而 Bolt 負責處理資料,可以自行定義每個 Bolt 的任務以及資料處理的路徑,最後將結果輸出或存放到資料庫。如下方的架構圖,多個資料來源可以同時接收並處理,也可以將資料分拆到不同的 Bolt 運算。

topology - Storm 快速上手:概念、佈署與範例

Spout-bolt 架構。圖 / Storm

請支持《傑瑞窩在這》原創文章。原文標題:Storm 快速上手:概念、佈署與範例,原文網址:https://jerrynest.io/storm-concept-install-example/

佈署 Storm 的方式

佈署 Hadoop 相關應用已經不像以往土法煉鋼,要自己設定機器,擺上幾包乖乖以防不測。現在,雲端平台提供許多解決方案,能直接使用 Hadoop 生態系服務,省去環境建設的麻煩。大致有這三種方式:

  • 使用雲端平台服務Amazon EMRAzure HDInsightGoogle 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 有沒有成功設定

lb - Storm 快速上手:概念、佈署與範例


基本範例 ExclamationTopology

在執行前,先簡單說明 ExclamationTopology 這個範例,詳細的官方教學請看這裡。 這個範例就是在文字後面加驚嘆號,如下圖, Spout 會從五個字裏頭隨機挑一個不斷發送文字,經過 Bolt 後,在文字後方加入三個驚嘆號。整個流程是 Spout -> Bolt -> Bolt。

storm example - Storm 快速上手:概念、佈署與範例

Spout 與 Bolt 的重要程式碼片段

storm example2 - Storm 快速上手:概念、佈署與範例

透過 TopologyBuilder 完成設定。後方的數值代表 thread 的數量,物件則是透過 shuffleGrouping 連接。Grouping 表示數據分流與合併的方式,有很多總形式,詳情請看說明

storm example3 - Storm 快速上手:概念、佈署與範例

$ 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

nimbus1 - Storm 快速上手:概念、佈署與範例

透過 Storm UI 看到剛剛上傳的 Topology 正常運作

nimbus2 - Storm 快速上手:概念、佈署與範例

執行 Topology 的 Log,你會發現文字加入驚嘆號囉 ! (nathan -> nathan!!! -> nathan!!!!!!)

Exclamation - Storm 快速上手:概念、佈署與範例


參考資料

樂於分享、盡情玩耍的全端工程師。長期關注資訊安全、雲端運算與網路行銷等議題,曾獲得玉山黑客松金牌,擔任過軟體測試實習生、技術文案寫手。

10 個回應

  1. 看起來 在storm-starter 這包下面 /opt/apache-storm-0.9.4/examples/storm-starter/src/jvm/storm/starter 有個 WordCountTopology.java 可以拿來OEM 一下, 雖也有spout / bolt 等,但中間是用python 去split, 而且是固定幾個單字random 出來的,應該改改便可以套用到作業來使用!

  2. 另在按裝 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 目錄中,您到上層找找也許會發現喔!

  3. 還有若有做好幾個storm constainer cluster 連結時, 記得先讓Google console 與Client 產生連繫,例如執行 gcloud container clusters get-credentials storm
    –zone us-central1-a –project ccu0003 , 這樣在create spark or storm 的yaml/json 時就不會有錯誤訊息的出現!

  4. 另若其他同學再綁定外部ip之時,要注意svc-storm-nimbus.yaml 此檔案寫法,前面需些空白之類的,最好參考一下svc-storm-ui.yaml 的寫法,這樣變萬無一失了!

    • Jason Kuo

      照老師講的跟振皓示範的做,真的會比較容易清楚且快完成說!

發表回應