Storm應用系列之——集羣部署

先簡單的把本文要做的事羅列一下:

1. 安裝zookeeper集羣

2. 安裝Storm集羣,包括一個Storm的nimbus,在nimbus上啓用Storm UI 和兩個supervisor

3. 跑一個小例子證實安裝完成


注:

本例中,nimbus機器IP爲10.1.110.24, 兩個supervisor分別爲10.1.110.21和10.1.110.22。後文不再用通配符寫IP。請自行更換IP。



準備工作

1. 下載zookeeper3.4.5(如果你比較懶,猛擊這裏
2. 下載Storm當前最新0.9.0.1 apache-storm-0.9.2-incubating(猛擊這裏
3. 安裝被配置好JDK(最低版本1.6)

注:
Storm0.9之前的版本,底層通訊用的是ZeroMQ,所以還得去裝一個老版本的ZeroMQ(2.1.7,不能裝太新的)。
由於ZeroMQ的各種問題,新版支持用Netty替代ZeroMQ。性能上據說能提高兩倍。但是默認仍是ZeroMQ,Netty方式需要配置來啓用。
github上面安裝文檔並沒有更新,所以,如果要裝老版的,可以參考這裏:


2014-07-29  新加註釋:

Storm現在移交到Apach了,新release的apache-storm-0.9.1-incubating直接將Netty換成了默認方式(更多更新參見這裏)。

所以啓用Netty部分的messaging部分的參數可以不帶了。



安裝ZK

1. 登陸到10.1.110.21並解壓tar包(注意給執行權限)
2. 建立zookeeper的data目錄,本文以 /var/tmp/zkdata 爲例
mkdir -p /var/tmp/zkdata

3. 建立zk集羣的myid文件 (單機版可以跳過該步)
cd /var/tmp/zkdata
echo 1 > myid

4. 拷貝zookeeper的conf/zoo_sample.cfg並重命名爲zoo.cfg,修改如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
dataDir=/var/tmp/zkdata
# the port at which the clients will connect
clientPort=2181
server.1=10.1.110.21:2888:3888
server.2=10.1.110.22:2888:3888
server.3=10.1.110.24:2888:3888
## Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
## http://zookeeper.apache.org/doc/current/zookeeperAdmin.html
#sc_maintenance
## The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

dataDir是配置zk的數據目錄的
server.A=B:C:D是集羣zk使用的。如果你只想用單個zk,可以不配置。
A - 是一個數字,表示這是第幾號服務器。與/var/tmp/zkdata下的myid文件內容一致
B - 是該服務器的IP地址
C - 表示該服務器與集羣中的Leader服務器交換信息的端口
D - 表示如果萬一集羣中的Leader服務器掛了,需要各服務器重新選舉時所用的通訊端口

5.  (Optional)將zk的bin目錄路徑加入環境變量
修改/etc/profile文件,在尾部添加如下:
#zookeeper
export ZOOKEEPER=/opt/zookeeper-3.4.5
PATH=$PATH:$ZOOKEEPER/bin
使其生效

6. 啓動zk
cd /opt/zookeeper-3.4.5/bin
./zkServer.sh start

在剩下兩臺機器重複以上步驟,注意myid要對應


安裝Storm

1. 解壓tar包並賦予執行權限
2. 將Storm的bin目錄加入系統路徑
修改/etc/profile文件,在尾部加入如下:
PATH=$PATH:/opt/storm-0.9.0.1/bin
使其生效

3. 創建一個Storm的本地數據目錄
mkdir -p /var/tmp/storm/workdir/

以上步驟在Storm的集羣上的其他機器上重複執行,然後進行配置:
a. 配置nimbus
修改storm的conf/storm.yaml文件如下:
########### These MUST be filled in for a storm configuration
 storm.zookeeper.servers:
     - "10.1.110.21"
     - "10.1.110.22"
     - "10.1.110.24"


#
# nimbus.host: "nimbus"
#
#
# ##### These may optionally be filled in:
#
## List of custom serializations
# topology.kryo.register:
#     - org.mycompany.MyType
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer
#
## List of custom kryo decorators
# topology.kryo.decorators:
#     - org.mycompany.MyDecorator
#
## Locations of the drpc servers
# drpc.servers:
#     - "server1"
#     - "server2"
 storm.local.dir: "/var/tmp/storm/workdir"


注意:
Storm的配置文件格式有點讓人鬱悶。在每個配置項前面必須留有空格,否則會無法識別。
storm.messaging.* 部分是Netty的配置。如果沒有該部分。那麼Storm默認還是使用ZeroMQ。 (如上所說,Apache新版默認Netty,無須額外添加了)

b. 配置supervisor
修改storm的conf/storm.yaml文件如下:
########### These MUST be filled in for a storm configuration
 storm.zookeeper.servers:
     - "10.1.110.21"
     - "10.1.110.22"
     - "10.1.110.24"
 
 nimbus.host: "10.1.110.24"
# 
# 
# ##### These may optionally be filled in:
#    
## List of custom serializations
# topology.kryo.register:
#     - org.mycompany.MyType
#     - org.mycompany.MyType2: org.mycompany.MyType2Serializer
#
## List of custom kryo decorators
# topology.kryo.decorators:
#     - org.mycompany.MyDecorator
#
## Locations of the drpc servers
# drpc.servers:
#     - "server1"
#     - "server2"
 supervisor.slots.ports:
     - 6700
     - 6701
     - 6702
 storm.local.dir: "/var/tmp/storm/workdir"


注意:
i.  nimbus.host是nimbus的IP或hostname
ii. supervisor.slots.ports 是配置slot的ip地址。配了幾個地址,就有幾個slot,即幾個worker。如果嘗試提交的topology所聲明的worker數超過當前可用的slot,該topology提交會失敗。
iii. storm.messaging 部分是Netty的配置,就不再重複敘述了。

仍然要注意格式問題。
你可以在這裏找到所有的配置項:https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml


啓動集羣

1. 啓動nimbus
在nimbus機器的Storm的bin目錄下執行
./storm nimbus

2. (Optional) 在nimbus機器上啓動 Storm UI  (Storm提供的一個簡單的查看cluster信息的網頁)
./storm ui

3. 啓動supervisor
在supervisor機器的Storm的bin目錄下執行
./storm supervisor

4. 檢查
打開Storm UI 頁面。本例是起在10.1.110.24上,所以打開: http://10.1.110.24:8080  
默認是啓在8080端口上,如果你想改成其他的,如8089,直接修改nimbus的storm.yaml文件,添加
 ui.port=8089

注意:
apache-storm-0.9.2-incubating 的storm ui 對於中文GBK或GB2312編碼方式打開有問題。具體參見下方問題列表。

部署程序

1. 從https://github.com/nathanmarz/storm-starter去clone或者下載一個例子包

2. 將包內的m2-pom.xml重命名爲pom.xml,並修改twitter4j的版本(人在中國傷不起啊.......)
<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-core</artifactId>
    <!--<version>2.2.6-SNAPSHOT</version>-->
    <version>[2.2,)</version>
</dependency>
<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-stream</artifactId>
    <!--<version>2.2.6-SNAPSHOT</version>-->
    <version>[2.2,)</version>
</dependency>
	
用Maven編譯
mvn clean install -Dmaven.test.skip

3. 將storm-starter/target目錄下的storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar拷到nimbus服務器上去

4. 部署topology
./storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology test

5. 查看結果
兩種方式,
a. 查看StormUI 

b. storm的bin目錄下運行
./storm list
769  [main] INFO  backtype.storm.thrift - Connecting to Nimbus at localhost:6627
Topology_name        Status     Num_tasks  Num_workers  Uptime_secs
-------------------------------------------------------------------
test                 ACTIVE     28         3            20        


6. 關閉topology
a. StormUI上面點選要關閉的topology,如test,然後在新頁面的Topology actions中選kill
b. 運行./storm kill test


常見問題

Storm的log文件默認存放在其logs目錄下,其中我們一般要關心的是
nimbus下的nimbus.log和ui.log
supervisor下的
superviosr.log - supervisor啓動、啓動topology task、關閉等信息
worker-xxxx.log - 該worker上運行的task的具體log

1. worker-xxxx.log 顯示2013-09-02 15:31:53 worker [WARN] Received invalid messages for unknown tasks. Dropping... 
該問題是host配置問題,解析host出問題
解決辦法:
a. 
hostname <new-name>
b. 
vi /etc/sysconfig/network
設置HOSTNAME=<new-name>

c. 
vi /etc/hosts
將ipv4地址解析成<new-name>,並添加其他節點信息,如:
10.1.110.24 nimbus
10.1.110.22 supervisor-22
10.1.110.21 supervisor-21

注意:
如果是ipv6,需要更改Storm的配置文件支持ipv6.默認是ipv4。

2. StormUI上面nimbus和supervisor都顯示127.0.0.1
解決辦法同1

3. 啓動時,supervisor.log不停刷新 5fefa024-50b2-4c5c-b8e2-c2360501cb03 still hasn't started
出現幾條是正常的,work 啓動需要時間。但是如果一直刷新,就有問題。可以到supervisor.log中把它上面緊挨着的java 啓動命令考下來,單獨執行。看看是哪裏有問題。

4. topologykill後,kill supervisor或nimbus,立刻啓動,有時會自動shutdown
supervisor和nimbus啓動、關閉後,zookeeper上信息會有同步。每次啓動,會嘗試恢復、停止上一次的task。對於supervisor,可以等到StormUI上面topology完全停止後,再重啓,可避免該問題。

5. 如何remote debug?
在storm的conf/storm.yaml裏面加入worker.childopts: "-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"。
注:
這個參數是給啓動的worker用的,一個worker對應一個JVM進程。所以如果有兩個worker在該節點上啓動,必定有一個fail。因爲端口衝突!
在shutdown一個topology時,該worker的進程並不會自動關閉,所以端口已然被佔着。這個時候再啓動時,有可能會分配一個新進程,這時又會去綁該端口,也會fail!
所以應儘量避免remote debug,最後在本地模式調試好後才上傳至cluster。
在每次debug後,要kill掉該supervisor才能避免下次部署失敗。

6. Storm UI裏面topology summary是空的?但是topology確實在運行着。
apache-storm-0.9.2-incubating引入了新版的jquery.tablesorter.min.js,其中有部分代碼如下
ts.addParser({
        id: "currency",
        is: function (s) {
            return /^[£$€?.]/.test(s);
        }, format: function (s) {
            return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), ""));
        }, type: "numeric"
    });

中間return 的正則特殊符號在GBK和GB2312下會有問題。導致js無法執行。
解決辦法:
修改
apache-storm-0.9.2-incubating/public/下的
component.html, 
index.html,
topology.html
在<head></head>中添加一行
<meta charset="UTF-8">
如此設定頁面encoding爲UTF-8就沒事了。

PS:我已經提交了這個修復,應該會被merge。

7. 如何查找某個component的log?
stormUI上找到該topology,點擊進去後找到目標component (spout或bolt 等), 點擊進去,找到 Executor 欄,裏面有Host和Port,其實就是執行該component的task的worker。每個port會對應logs目錄下worker-<port>.log的一個log文件,直接去該host上找到該文件查看即可。
注:
Storm有個logviewer的功能,即在每個superviosr上啓動 ./storm logviewer 後,就可以在stormUI裏面點擊那個port後直接查看靜態的log。
如果打不開,檢查supervisor上logs/logviewer.log,看是否有錯。然後看打開的URL裏面host名在本地是否能正確的解析爲目標IP。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章