* 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
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。