天天看點

Storm架構基礎(一)

* Storm架構基礎(一)

Storm簡述

如果你了解過SparkStreaming,那麼Storm就可以類比着入門,在此我們可以先做一個簡單的比較:

 在SparkStreaming中:

我們曾嘗試過每秒鐘的實時資料處理,或者使用Window若幹時間範圍内的資料統一處理結果。亦或統計所有時間範圍内的資料結果。

在Storm中:

我們可以根據進來的每一條資料進行實時處理,也就是說,Storm處理資料的速度,要小于1秒,也就是毫秒級别的。

如果你疑問,1秒處理1次資料,和進來1條資料處理1次有什麼差别,稍作思考答案應該是顯而易見的,因為1秒中就可以産生不計其數的資料。

Storm角色

主節點:Nimbus

從節點:Supervisor

Storm基本概念

Nimbus:主節點

Supervisor:從節點

Worker:任務工作程序,類似于YARN的ApplicationMaster,可以存在多個,不同的任務有不同的Worker

Executor:Worker程序在執行任務時,會啟動多個Executor現成

Topology:task任務的拓撲結構,是一個DAG有向無環圖

Spout:抽取資料并将資料進行分發的階段

Bolt:将分發的資料進行具體操作的階段

Storm叢集配置

zookeeper在這裡起到同步主/從節點狀态資訊的作用,後續會詳解,是以Storm是依賴zookeeper的

Storm的安裝部署

OK,閑話不多說,我們直接開始部署Storm,部署完成後,我們再根據運作的任務,來解析一下Storm任務運作的流程和排程過程以及其中的簡單原理。

本次安裝需要依賴Java以及Python環境,如果目前虛拟機沒有,請自行安裝,安裝後檢測,如圖:

注意Python是2版本系列

官網網站:storm.apache.org

Storm下載下傳傳送門:

連結:http://pan.baidu.com/s/1pLwj4dt 密碼:resv

Step1、解壓

$ tar -zxf apache-storm-0.9.6.tar.gz -C  /opt/modules/

Step2、修改配置檔案

尖叫提示:Notepad++編輯配置檔案可能會導緻yaml檔案格式錯亂,請留意,建議使用sublime或者vi編輯

storm_env.ini

storm.yaml

配置幫助頁面:http://storm.apache.org/releases/0.9.6/Setting-up-a-Storm-cluster.html

配置完成後将安裝包scp到其他機器節點。

Step3、啟動三台節點的zookeeper叢集

$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start

Step4、啟動Nimbus和UI程序

$ nohup bin/storm nimbus > /dev/null 2>&1 &

$ nohup bin/storm ui > /dev/null 2>&1 &

檢查:

$ jps

啟動後需要稍等片刻,才能config_value從這個配置程序切換到對應程序

$ ps -ef | grep daemon.nimbus

$ ps -ef | grep ui.core

如圖:

Step5、所有節點啟動Supervisor和logviewer程序

$ nohup bin/storm supervisor > /dev/null 2>&1 &

$ nohup bin/storm logviewer > /dev/null 2>&1 &

檢查第一台節點(第二,第三台節點請自行檢查):

$ ps -ef | grep daemon.supervisor

$ ps -ef | grep daemon.logviewer

尖叫提示:

預設情況下,nohup執行的日志在目前目錄下的nohup.out中,但此刻我們将日志重定向到了/dev/null裝置中(即空裝置)意思就是丢棄不要了。

Step6、登入z01:8081檢視storm叢集啟動情況,如下圖所示

Step7、運作個官方案例,測試一下吧

$ bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount

任務送出後,可以在此檢視:

打開該任務,可以看到有一個DAG圖:

後續涉及到代碼編寫的時候自然會明白該圖在說什麼

Storm叢集運作機制

主節點Nimbus

管理所有從節點supervisor,當主節點nimbus啟動後會定時向zookeeper叢集發送自己的目前狀态資訊,同時也可以擷取所有從節點Supervisor的狀态資訊

從節點Supervisor

定時向zookeeper叢集彙報自己的狀态資訊,同時接受主節點Nimbus派發過來的任務。

Zookeeper的作用

Storm的所有節點的狀态資訊都儲存在zookeeper當中,如果有某個節點挂掉了,隻需要啟動一個新的節點來替代即可,新的節點啟動後,會自動從zookeeper中讀取之前的狀态資訊,然後恢複到該狀态下。同時也不必擔心task任務意外終止,因為可以通過zookeeper來恢複該任務,也就是重新開機挂掉的task。nimbus和supervisor之間的狀态同步全部依賴zookeeper來實作,看如下一張圖,該圖是zookeepr中storm的目錄結構:

$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkCli.sh -server z01:2181

[zk: z01:2181(CONNECTED) 0] ls /

[hbase, hadoop-ha, admin, zookeeper, consumers, config, rmstore, storm, yarn-leader-election, brokers, controller_epoch]

[zk: z01:2181(CONNECTED) 1] ls /storm

[workerbeats, storms, supervisors, errors, assignments]

/workerbeats:存儲worker工作程序的運作狀态資訊

/storms:存儲的Topology的基本配置資訊

/supervisors:存儲supervisor節點的狀态資訊

/errors:存儲Topology任務運作過程中出現的異常資訊

/assignments:存儲的是Topology任務的配置設定資訊

Storm代碼實作WordCount

Step1、打開IDEA工具建構一個Maven工程,此步驟前文已經進行了多次練習,不再贅述

Step2、指定倉庫位址,如果預設則無需改動

Step3、設定項目名稱及工作路徑,Finish即可

Step4、完事之後呢,打開pom.xml進行如下配置

這個過程可能會有點慢,因為要從聯網下載下傳各種依賴包

Step5、第四步全部搞定之後,如果下載下傳了assembly插件,則需要添加如下配置,如果你不适用assembly則不需要Step5,你可以仿照前文Spark章節的打包過程進行。

src.xml的内容是:

Step6、我們就來根據這張圖來編寫代碼

這張圖說明的是,storm的topology任務大概分為兩個階段,第一個階段是spout階段,主要負責資料的抽取,第二個階段是bolt階段,主要負責資料的處理,既然我們是要實作WordCount,是以Bolt資料處理階段又分為兩個過程,分别是單詞的切分過程split和單詞的彙總過程count,這兩個過程都是bolt階段。好,那麼我們需要建構4個類,分别為:

WordCountTopology.Java

SentenceSpout.java

SplitBolt.java

CountBolt.java

(尖叫提示:Storm中的Spout和Bolt類必須是可序列化的,IDEA工具如何生成serialVersionUID請檢視該文章:IDEA工具生成serialVersionUID)

Step7、SentenceSpout.java實作細節

Step8、SplitBolt.java實作細節

Step9、CountBolt實作細節

Step10、WordCountTopology實作細節

Step11、激動人心的測試,Run起來之後,可以看到不停的有類似這樣的結果輸出

Step12、打包送出到叢集測試

打包時記得provided這個屬性注釋打開。

或者你使用IDEA自帶的打包工具(請參考SparkCore(二)Spark打包部分内容)

總之你就是要弄個jar包出來,一切了然之後,我們先kill掉之前運作的wordcount,然後運作我們自己打出來的jar包。

$ bin/storm jar storm_syllabus.jar com.z.WordCountTopology ZWordCount

UI界面檢視:

注意,如果送出任務後,jps檢視不到worker程序,也許是worker程序運作在其他節點,請依次檢視。

so easy,right?

* 總結

學習完Spark後再學習Storm會簡單很多,可以類比着來學習,其分布式運算的思想大多都有交集之處,慢慢體會。下一節我們繼續探讨Storm架構。

個人微網誌:http://weibo.com/seal13

QQ大資料技術交流群(廣告勿入):476966007

作者:Z盡際
連結:https://www.jianshu.com/p/7e5fc624861b
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。