18. Storm基礎

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集群中讀取狀態信息就可以了。

Storm整體架構.png

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
Paste_Image.png
topology視圖.png

4. Storm集群啟停腳本:

Nimbus topology任務提交后,程序是運行在supervisor節點上,nimbus不參與程序的運行。
如果nimbus出現故障,不能提交topology,但是已經提交了的topology還是正常運行在集群上的。已經運行在集群上的topology,如果這時候某些task出現異常則無法重新分配節點。

1.查看topology的日志:

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

Storm UI界面.png

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

$ 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 : 當動態添加了一個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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容