18. Storm基礎(chǔ)

1. Storm介紹:

Storm是實時流計算框架龙考。企業(yè)中典型實時分析框架搭建模式: Flume + Kafka + Storm + Hbase 茧球,對這類要求分析結(jié)果能妙級甚至毫秒級反饋的場景均践,需要用專門的實時分析框架椒袍,例如Storm和Spark Streaming藕施。
最初由BackType公司研發(fā)出來寇损,2011年7月被Twitter公司收購,Twitter公司將Storm應(yīng)用到他們的海量數(shù)據(jù)實時處理上裳食。Storm核心部分是由Clojure語言編寫的矛市,Clojure是面向函數(shù)式編程語言,運行在JVM上诲祸。阿里將Storm核心部分用java改寫浊吏,同時對原先Storm性能不好的地方做了優(yōu)化,這就是JStorm烦绳,目前Strom和JStorm都由Apache來維護卿捎。

1. 使用場景:

1.信息流的實時處理:例如實時抓拍汽車行車速度,計算判斷是否超速并實時處罰径密。
2.實時日志分析
3.分布式RPC(遠程過程調(diào)用) DRPC: 查詢請求 --> storm處理 -->實時返回結(jié)果午阵。

2.特性

1.分布式框架。
2.可靠性高享扔、容錯性高底桂。
3.計算結(jié)果可靠:消息可靠性保障機制。
4.性能高惧眠、處理速度快籽懦。為了提高性能,可以不使用storm的消息可靠性保障機制氛魁。

3.與hadoop的區(qū)別和聯(lián)系

Storm并不屬于Hadoop生態(tài)系統(tǒng)的框架暮顺。MapReduce是離線數(shù)據(jù)分析,批次處理數(shù)據(jù)秀存,數(shù)據(jù)處理完成后程序就會終止捶码;Storm是實時數(shù)據(jù)分析,任務(wù)提交后會一直循環(huán)運行或链。
Storm其實也可以進行批量處理數(shù)據(jù)惫恼,但是不會這么用,可以讀取HDFS上的文件澳盐,一行一行處理祈纯,直到文件處理結(jié)束令宿。

2. Storm架構(gòu):

Storm是Master-Slaves 主從架構(gòu)(與hadoop等一致)。主節(jié)點是Nimbus腕窥,從節(jié)點是Supervisor粒没。主節(jié)點和從節(jié)點借助Zookeeper集群來溝通。
Storm集群的各個組件本身都是無狀態(tài)的(不保存狀態(tài)信息)簇爆,例如nimbus革娄、supervisor、worker等冕碟,所有的狀態(tài)信息都保存在zookeeper集群中。這樣的話匆浙,集群的可靠性非常高安寺,某個Nimbus(或者Supervisor)宕機后,只需要重啟一個Nimbus節(jié)點(或者Supervisor節(jié)點)首尼,再從Zookeeper集群中讀取狀態(tài)信息就可以了挑庶。

Storm整體架構(gòu).png

1.Nimbus主節(jié)點:

1.監(jiān)控從節(jié)點Supervisor的狀態(tài):Supervisor啟動和運行過程中會定時將心跳狀態(tài)信息發(fā)送到Zookeeper上,也就是在Zookeeper集群上創(chuàng)建Znode節(jié)點软能,Nimbus監(jiān)聽該Znode節(jié)點來監(jiān)控Supervisor節(jié)點的狀態(tài)迎捺。
2.接收客戶端任務(wù)的提交Topology
3.進行任務(wù)代碼的分發(fā)、任務(wù)Task的分配協(xié)調(diào)查排,異常任務(wù)的重新分配凳枝。

2.Supervisor從節(jié)點:

Supervisor是真正的工作節(jié)點。Supervisor接收到任務(wù)分配后跋核,啟動Worker節(jié)點(一個或者多個)岖瑰。
1.獲取任務(wù):Nimbus分配任務(wù)的時候,將任務(wù)信息發(fā)送到Zookeeper上砂代,Supervisor監(jiān)聽相應(yīng)的Znode節(jié)點信息蹋订,拿到分配給他的任務(wù)。
2.獲取到任務(wù)后刻伊,啟動相應(yīng)的Worker進程露戒,Worker進程數(shù)根據(jù)具體的Topology來決定的,之后監(jiān)控Worker進程狀態(tài)(Worker進程啟動好之后捶箱,在運行過程中也會將心跳狀態(tài)信息發(fā)送到zookeeper上智什,supervisor也是通過監(jiān)聽znode節(jié)點信息來監(jiān)控worker進程的)

3.Worker進程(JVM):

Worker進程不是常駐進程(Nimbus和Supervisor是Storm框架的常駐進程),并且跟具體的Topology相關(guān)讼呢。Worker進程上具體運行相應(yīng)的Topology的Task任務(wù)撩鹿。
Worker進程啟動Executor線程。Task運行時真正地跑在線程上悦屏,Executor線程真正執(zhí)行Task节沦。

4.Zookeeper集群:

用來存儲各節(jié)點键思、各組件的狀態(tài)信息。

5.topology任務(wù)執(zhí)行整體流程:

Client端向Storm集群提交Topology程序甫贯,Nimbus接收到Topology程序后進行任務(wù)分配吼鳞,將執(zhí)行代碼以及相關(guān)的配置信息分發(fā)到各個Supervisor上(注意,這里不通過zookeeper集群叫搁。通過Thrift直接分發(fā)到Supervisor節(jié)點赔桌。)。將任務(wù)分配信息發(fā)送到Zookeeper集群上渴逻,Supervisor從Zookeeper上獲取相應(yīng)的任務(wù)疾党,根據(jù)任務(wù)的要求啟動Worker進程,Worker進程啟動后惨奕,Worker進程會啟動一些Executor線程(也是根據(jù)任務(wù)的要求啟動)雪位。Executor線程才是最終真正執(zhí)行Task邏輯的組件。

3. Storm集群環(huán)境搭建:

集群環(huán)境的搭建梨撞,需要根據(jù)官網(wǎng)文檔指導(dǎo)雹洗,選用的版本是比較穩(wěn)定的0.9.6版本。官網(wǎng)文檔:http://storm.apache.org/releases/0.9.6/Setting-up-a-Storm-cluster.html
1.創(chuàng)建zookeeper集群卧波;
2.在Nimbus和worker機器上安裝前置依賴(java和Python)时肿;
3.在Nimbus和worker機器上下載和解壓Strom安裝包;
4.在配置文件storm.yaml中增加必要配置港粱;
5.啟動Storm進程螃成。

前置安裝內(nèi)容:網(wǎng)絡(luò)、IP查坪、主機名锈颗、主機名和IP的映射關(guān)系、免密碼登陸咪惠、zookeeper集群击吱、JDK、Python安裝遥昧。

1. 搭建Zookeeper集群:

Zookeeper集群的搭建方法覆醇,前面文章已有介紹。在zookeeper配置中需要做些修改炭臭,刪掉以下兩項的注釋:

autopurge.snapRetainCount=3
autopurge.purgeInterval=1
$ scp /opt/modules/zookeeper-3.4.5-cdh5.3.6/conf/zoo.cfg natty@hadoop-senior02.pmpa.com:/opt/modules/zookeeper-3.4.5-cdh5.3.6/conf/

autopurge.snapRetainCount是Zookeeper的快照的保存的配置永脓,如果不開啟此項,zookeeper的快照會很快占用很大的空間鞋仍。自動合并常摧,每隔1小時自動合并zookeeper上的數(shù)據(jù),相當于日志清理。
Zookeeper的批量啟動腳本:

#!/bin/bash

if [ $# -ne 1 ] 
then
   echo "Useage: sh zkServer_batch.sh [start|status|stop]"
   exit 2
fi

for node in 192.168.8.128 192.168.8.129 192.168.8.130
do
    echo "$1 in $node"
    ssh $node "source /etc/profile && /opt/modules/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh $1"
done

免密登陸落午,telnet XXX:3888 如何開通3888端口的訪問谎懦。

2. 安裝Storm集群:

1.檢查python的版本,一般情況下CentOS都會安裝python溃斋。對于該版本storm界拦,python不能是3.x版本,必須是2.x版本梗劫。

$ python --version

2.下載并解壓storm release文件:

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

3.修改配置文件conf/storm.yaml:

storm.zookeeper.servers:
     - "hadoop-senior01.pmpa.com"
     - "hadoop-senior02.pmpa.com"
     - "hadoop-senior03.pmpa.com"

nimbus.host: "hadoop-senior01.pmpa.com"

storm.local.dir: "/opt/modules/apache-storm-0.9.6/local"

supervisor.slots.ports:
    - 6700
    - 6701
    - 6702
    - 6703
    - 6704

ui.port: 8081

默認日志會寫到根目錄下:

01:13:54,021 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[A1] - openFile(/nimbus.log,true) call failed. java.io.FileNotFoundException: /nimbus.log (Permission denied)

啟動Storm 的 nimbus和 supervisor:

$ bin/storm nimbus > ./logs/nimbus.out 2>&1 &
$ bin/storm supervisor > ./logs/supervisor.out 2>&1 &

啟動UI:

$ bin/storm ui > ./logs/ui.out 2>&1 &

測試提交topology:

$ bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.6.jar storm.starter.WordCountTopology wordcount
Paste_Image.png
topology視圖.png

4. Storm集群啟停腳本:

Nimbus topology任務(wù)提交后享甸,程序是運行在supervisor節(jié)點上,nimbus不參與程序的運行梳侨。
如果nimbus出現(xiàn)故障蛉威,不能提交topology,但是已經(jīng)提交了的topology還是正常運行在集群上的走哺。已經(jīng)運行在集群上的topology瓷翻,如果這時候某些task出現(xiàn)異常則無法重新分配節(jié)點。

1.查看topology的日志:

上邊我們啟動了例子的wordcount topology割坠,如下圖:

Storm UI界面.png

為了查看Topology(wordcount)的運行日志, 需要啟動進程logviewer妒牙,需要在每個supervisor節(jié)點上啟動彼哼,不用在nimbus節(jié)點啟動。

$ bin/storm logviewer > ./logs/logviewer.out 2>&1 &

在supervisor上啟動了logviewer后湘今,就可以在Storm UI界面上查看wordcount的日志了敢朱。在ui界面上點擊“wordcount”(topology名稱)。


Topology日志.png

上邊可以看到topology的組件 Spouts摩瞎、Bolts等等拴签。

2.停止Topology:

1.可以在ui界面上停止topology:


UI界面控制Topology.png

Activate : 激活
Deactivate :暫停
Rebalance : 當動態(tài)添加了一個Supervisor節(jié)點,想要讓Topology部分任務(wù)能使用該新增的Supervisor旗们,那就可以通過Rebalance實現(xiàn)蚓哩。
Kill : 將Topology從Storm集群上移除。

2.通過命令行停止:
可以使用下命令kill掉topology:

$ bin/storm kill wordcount

其中wordcount是你啟動topology時上渴,所指定的名稱岸梨。

3.在Zookeeper查看存儲的Storm節(jié)點信息:

為了查看zookeeper存儲的節(jié)點信息,需要打開zookeeper的客戶端稠氮。選擇任何一個zookeeper節(jié)點曹阔,執(zhí)行命令:

$ bin/zkCli.sh 

[zk: localhost:2181(CONNECTED) 1] ls /
[storm, hbase, zookeeper]

[zk: localhost:2181(CONNECTED) 2] ls /storm
[workerbeats, errors, supervisors, storms, assignments]

在zookeeper的根節(jié)點下,有個Storm子節(jié)點隔披。也就是赃份,在zookeeper中有一個storm Znode,而在storm Znode下有5個子Znode:workerbeats, errors, supervisors, storms, assignments奢米。

/workerbeats : worker的心跳信息抓韩;
/errors : topology運行過程中Task運行異常信息(Task在哪個Supervisor上運行失敗的纠永,nimbus需要對異常任務(wù)重新分配);
/supervisors :記錄supervisor狀態(tài)心跳信息园蝠;
/storms :記錄topology任務(wù)信息(哪個jar包渺蒿,jar包位置等)
/assignments :記錄的是topology任務(wù)的分配信息。

4.storm的nimubs彪薛、supervisor茂装、ui、logviewer進程的關(guān)閉:

不像Hadoop善延,Storm沒有提供這些進程的stop腳本少态。可以通過kill -9 方式來關(guān)閉這些進程易遣。查看進程pid的方式:

$ ps -ef | grep daemon.nimbus | awk '{print $2}' | head -n 1

在關(guān)閉進程前彼妻,一定記得先要關(guān)閉topology。 下面腳本(在主節(jié)點上執(zhí)行)完成storm的批量啟停豆茫。

5.storm的批量啟動腳本:

先創(chuàng)建一個文件侨歉,來保存supervisor節(jié)點的主機名,supervisor_cluster.conf :

hadoop-senior02.pmpa.com
hadoop-senior03.pmpa.com

Storm批量啟動腳本揩魂,start_storm.sh

#!/bin/bash

source /etc/profile
STROM_HOME=/opt/modules/apache-storm-0.9.6

##主節(jié)點:啟動nimubs和ui
${STORM_HOME}/bin/storm nimbus > /dev/null 2>&1 &
${STORM_HOME}/bin/storm ui > /dev/null 2>&1 &

##從節(jié)點幽邓,啟動supervisor和logviewer:
for supervisor in `cat supervisor_cluster.conf`
do
      ssh ${supervisor} "source /etc/profile && ${STORM_HOME}/bin/storm supervisor> /dev/null 2>&1 &" & 
      ssh ${supervisor} "source /etc/profile && ${STORM_HOME}/bin/storm logviewer> /dev/null 2>&1 &" &
done

6.storm的批量停止腳本:

在執(zhí)行該腳本之前,必須要保證所有的topology關(guān)閉火脉。storm的關(guān)閉需要殺掉nimbus和supervisor上的所有的進程牵舵。

#!/bin/bash

# author: natty    date:2017-08-22
# Storm batch close. Kill these processes: nimubs,supervisor,ui,logviewer

source /etc/profile
kill -9 `ps -ef | grep nimbus.daemon | awk '{print $2}'`
kill -9 `ps -ef | grep ui.daemon | awk '{print $2}'`

for supervisor in `cat supervisor_cluster.conf`
do
   ssh ${supervisor} "source /etc/profile && kill -9 `ps -ef | grep supervisor.daemon | awk '{print $2}'`" &
   ssh ${supervisor} "source /etc/profile && kill -9 `ps -ef | grep logviewer.daemon | awk '{print $2}'`" &
done
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倦挂,隨后出現(xiàn)的幾起案子畸颅,更是在濱河造成了極大的恐慌,老刑警劉巖方援,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件没炒,死亡現(xiàn)場離奇詭異,居然都是意外死亡犯戏,警方通過查閱死者的電腦和手機窥浪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛丙,“玉大人漾脂,你說我怎么就攤上這事∨哐欤” “怎么了骨稿?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我坦冠,道長形耗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任辙浑,我火速辦了婚禮激涤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘判呕。我一直安慰自己倦踢,他們只是感情好,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布侠草。 她就那樣靜靜地躺著辱挥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边涕。 梳的紋絲不亂的頭發(fā)上晤碘,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音功蜓,去河邊找鬼园爷。 笑死,一個胖子當著我的面吹牛式撼,可吹牛的內(nèi)容都是我干的童社。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼端衰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甘改?” 一聲冷哼從身側(cè)響起旅东,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎十艾,沒想到半個月后抵代,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡忘嫉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年荤牍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庆冕。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡康吵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出访递,到底是詐尸還是另有隱情晦嵌,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惭载,受9級特大地震影響旱函,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜描滔,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一棒妨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧含长,春花似錦券腔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至田弥,卻和暖如春涛酗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偷厦。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工商叹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人只泼。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓剖笙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親请唱。 傳聞我的和親對象是個殘疾皇子弥咪,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容