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)信息就可以了挑庶。
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
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割坠,如下圖:
為了查看Topology(wordcount)的運行日志, 需要啟動進程logviewer妒牙,需要在每個supervisor節(jié)點上啟動彼哼,不用在nimbus節(jié)點啟動。
$ bin/storm logviewer > ./logs/logviewer.out 2>&1 &
在supervisor上啟動了logviewer后湘今,就可以在Storm UI界面上查看wordcount的日志了敢朱。在ui界面上點擊“wordcount”(topology名稱)。
上邊可以看到topology的組件 Spouts摩瞎、Bolts等等拴签。
2.停止Topology:
1.可以在ui界面上停止topology:
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