1. Storm介紹:
Storm是實時流計算框架。企業中典型實時分析框架搭建模式: Flume + Kafka + Storm + Hbase ,對這類要求分析結果能妙級甚至毫秒級反饋的場景,需要用專門的實時分析框架,例如Storm和Spark Streaming。
最初由BackType公司研發出來,2011年7月被Twitter公司收購,Twitter公司將Storm應用到他們的海量數據實時處理上。Storm核心部分是由Clojure語言編寫的,Clojure是面向函數式編程語言,運行在JVM上。阿里將Storm核心部分用java改寫,同時對原先Storm性能不好的地方做了優化,這就是JStorm,目前Strom和JStorm都由Apache來維護。
1. 使用場景:
1.信息流的實時處理:例如實時抓拍汽車行車速度,計算判斷是否超速并實時處罰。
2.實時日志分析
3.分布式RPC(遠程過程調用) DRPC: 查詢請求 --> storm處理 -->實時返回結果。
2.特性
1.分布式框架。
2.可靠性高、容錯性高。
3.計算結果可靠:消息可靠性保障機制。
4.性能高、處理速度快。為了提高性能,可以不使用storm的消息可靠性保障機制。
3.與hadoop的區別和聯系
Storm并不屬于Hadoop生態系統的框架。MapReduce是離線數據分析,批次處理數據,數據處理完成后程序就會終止;Storm是實時數據分析,任務提交后會一直循環運行。
Storm其實也可以進行批量處理數據,但是不會這么用,可以讀取HDFS上的文件,一行一行處理,直到文件處理結束。
2. Storm架構:
Storm是Master-Slaves 主從架構(與hadoop等一致)。主節點是Nimbus,從節點是Supervisor。主節點和從節點借助Zookeeper集群來溝通。
Storm集群的各個組件本身都是無狀態的(不保存狀態信息),例如nimbus、supervisor、worker等,所有的狀態信息都保存在zookeeper集群中。這樣的話,集群的可靠性非常高,某個Nimbus(或者Supervisor)宕機后,只需要重啟一個Nimbus節點(或者Supervisor節點),再從Zookeeper集群中讀取狀態信息就可以了。
1.Nimbus主節點:
1.監控從節點Supervisor的狀態:Supervisor啟動和運行過程中會定時將心跳狀態信息發送到Zookeeper上,也就是在Zookeeper集群上創建Znode節點,Nimbus監聽該Znode節點來監控Supervisor節點的狀態。
2.接收客戶端任務的提交Topology
3.進行任務代碼的分發、任務Task的分配協調,異常任務的重新分配。
2.Supervisor從節點:
Supervisor是真正的工作節點。Supervisor接收到任務分配后,啟動Worker節點(一個或者多個)。
1.獲取任務:Nimbus分配任務的時候,將任務信息發送到Zookeeper上,Supervisor監聽相應的Znode節點信息,拿到分配給他的任務。
2.獲取到任務后,啟動相應的Worker進程,Worker進程數根據具體的Topology來決定的,之后監控Worker進程狀態(Worker進程啟動好之后,在運行過程中也會將心跳狀態信息發送到zookeeper上,supervisor也是通過監聽znode節點信息來監控worker進程的)
3.Worker進程(JVM):
Worker進程不是常駐進程(Nimbus和Supervisor是Storm框架的常駐進程),并且跟具體的Topology相關。Worker進程上具體運行相應的Topology的Task任務。
Worker進程啟動Executor線程。Task運行時真正地跑在線程上,Executor線程真正執行Task。
4.Zookeeper集群:
用來存儲各節點、各組件的狀態信息。
5.topology任務執行整體流程:
Client端向Storm集群提交Topology程序,Nimbus接收到Topology程序后進行任務分配,將執行代碼以及相關的配置信息分發到各個Supervisor上(注意,這里不通過zookeeper集群。通過Thrift直接分發到Supervisor節點。)。將任務分配信息發送到Zookeeper集群上,Supervisor從Zookeeper上獲取相應的任務,根據任務的要求啟動Worker進程,Worker進程啟動后,Worker進程會啟動一些Executor線程(也是根據任務的要求啟動)。Executor線程才是最終真正執行Task邏輯的組件。
3. Storm集群環境搭建:
集群環境的搭建,需要根據官網文檔指導,選用的版本是比較穩定的0.9.6版本。官網文檔:http://storm.apache.org/releases/0.9.6/Setting-up-a-Storm-cluster.html
1.創建zookeeper集群;
2.在Nimbus和worker機器上安裝前置依賴(java和Python);
3.在Nimbus和worker機器上下載和解壓Strom安裝包;
4.在配置文件storm.yaml中增加必要配置;
5.啟動Storm進程。
前置安裝內容:網絡、IP、主機名、主機名和IP的映射關系、免密碼登陸、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上的數據,相當于日志清理。
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任務提交后,程序是運行在supervisor節點上,nimbus不參與程序的運行。
如果nimbus出現故障,不能提交topology,但是已經提交了的topology還是正常運行在集群上的。已經運行在集群上的topology,如果這時候某些task出現異常則無法重新分配節點。
1.查看topology的日志:
上邊我們啟動了例子的wordcount topology,如下圖:
為了查看Topology(wordcount)的運行日志, 需要啟動進程logviewer,需要在每個supervisor節點上啟動,不用在nimbus節點啟動。
$ 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 : 當動態添加了一個Supervisor節點,想要讓Topology部分任務能使用該新增的Supervisor,那就可以通過Rebalance實現。
Kill : 將Topology從Storm集群上移除。
2.通過命令行停止:
可以使用下命令kill掉topology:
$ bin/storm kill wordcount
其中wordcount是你啟動topology時,所指定的名稱。
3.在Zookeeper查看存儲的Storm節點信息:
為了查看zookeeper存儲的節點信息,需要打開zookeeper的客戶端。選擇任何一個zookeeper節點,執行命令:
$ 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的根節點下,有個Storm子節點。也就是,在zookeeper中有一個storm Znode,而在storm Znode下有5個子Znode:workerbeats, errors, supervisors, storms, assignments。
/workerbeats : worker的心跳信息;
/errors : topology運行過程中Task運行異常信息(Task在哪個Supervisor上運行失敗的,nimbus需要對異常任務重新分配);
/supervisors :記錄supervisor狀態心跳信息;
/storms :記錄topology任務信息(哪個jar包,jar包位置等)
/assignments :記錄的是topology任務的分配信息。
4.storm的nimubs、supervisor、ui、logviewer進程的關閉:
不像Hadoop,Storm沒有提供這些進程的stop腳本。可以通過kill -9 方式來關閉這些進程。查看進程pid的方式:
$ ps -ef | grep daemon.nimbus | awk '{print $2}' | head -n 1
在關閉進程前,一定記得先要關閉topology。 下面腳本(在主節點上執行)完成storm的批量啟停。
5.storm的批量啟動腳本:
先創建一個文件,來保存supervisor節點的主機名,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
##主節點:啟動nimubs和ui
${STORM_HOME}/bin/storm nimbus > /dev/null 2>&1 &
${STORM_HOME}/bin/storm ui > /dev/null 2>&1 &
##從節點,啟動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的批量停止腳本:
在執行該腳本之前,必須要保證所有的topology關閉。storm的關閉需要殺掉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