[storm]storm在centos環境下搭建


環境:

  • centos 7
  • storm 1.0.0
  • jdk 1.8
  • python 2.7.5
  • zookeeper 3.4.8

安裝環境依賴:

  這里,假設你 已經安裝好了jdk、Python

安裝zookeeper:

  1. 下載zookeeper http://www.apache.org/dyn/closer.cgi/zookeeper/
  2. 解壓並cp到 /usr/local下,並建立軟連接
  3. 創建tmp文件夾,用於存放zookeeper的data數據;然后修改zoo_simple.cfg為 zoo.cfg
  4. 編輯 zoo.cfg,把datadir修改為 /usr/local/zookeeper/tmp
  5. 啟動zookeeper

詳細shell腳本如下:

# 復制到usr/local目錄下
[root@localhost hager]# mv zookeeper-3.4.8 /usr/local/
# 軟連
[root@localhost local]# ln -s zookeeper-3.4.8/ zookeeper

#修改權限 其中hager表示你的賬戶名
[root@localhost local]# sudo chown -R hager ./zookeeper

#創建文件夾
[root@localhost zookeeper]# mkdir tmp

#修改配置
[root@localhost zookeeper]# cp conf/zoo_sample.cfg conf/zoo.cfg

#啟動服務
[root@localhost bin]# ./zkServer.sh start

 

安裝storm:

  1. 下載storm:http://www.apache.org/dyn/closer.lua/storm/apache-storm-1.0.0/apache-storm-1.0.0.tar.gz
  2. 解壓tar -zxvf apache-storm-1.0.0.tar.gz
  3. cp到/usr/local下,並建立軟連接
  4. 運行授權
  5. 修改storm.yaml文件
  6. 運行服務

詳細shell如下:

[root@localhost local]# ln -s apache-storm-1.0.0/ apache-storm

[root@localhost local]# sudo chown -R hager ./apache-storm

[root@localhost apache-storm]# cd conf/
########### These MUST be filled in for a storm configuration
# storm.zookeeper.servers:
#     - "server1"
#     - "server2"
# 
# nimbus.seeds: ["host1", "host2", "host3"]
# 因為是在單機本機運行,所以把server和seeds都設置為本機IP storm.zookeeper.servers:
- "127.0.0.1" nimbus.seeds: ["127.0.0.1"]

簡單配置后就可以啟動 Storm 了。執行如下命令啟動 nimbus 后台進程:

[root@localhost bin]# ./storm nimbus
Running: /usr/java/jdk1.8.0_72/bin/java -server -Ddaemon.name=nimbus -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-1.0.0 -Dstorm.log.dir=/usr/local/apache-storm-1.0.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-1.0.0/lib/storm-core-1.0.0.jar:/usr/local/apache-storm-1.0.0/lib/kryo-3.0.3.jar:/usr/local/apache-storm-1.0.0/lib/reflectasm-1.10.1.jar:/usr/local/apache-storm-1.0.0/lib/asm-5.0.3.jar:/usr/local/apache-storm-1.0.0/lib/minlog-1.3.0.jar:/usr/local/apache-storm-1.0.0/lib/objenesis-2.1.jar:/usr/local/apache-storm-1.0.0/lib/clojure-1.7.0.jar:/usr/local/apache-storm-1.0.0/lib/disruptor-3.3.2.jar:/usr/local/apache-storm-1.0.0/lib/log4j-api-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-core-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-slf4j-impl-2.1.jar:/usr/local/apache-storm-1.0.0/lib/slf4j-api-1.7.7.jar:/usr/local/apache-storm-1.0.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/apache-storm-1.0.0/lib/servlet-api-2.5.jar:/usr/local/apache-storm-1.0.0/lib/storm-rename-hack-1.0.0.jar:/usr/local/apache-storm/conf -Xmx1024m -Dlogfile.name=nimbus.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/apache-storm-1.0.0/log4j2/cluster.xml org.apache.storm.daemon.nimbus

 

啟動 nimbus 后,終端被該進程占用了,不能再繼續執行其他命令了。因此我們需要另外開啟一個終端,然后執行如下命令啟動 supervisor 后台進程:

[root@localhost bin]# ./storm supervisor
Running: /usr/java/jdk1.8.0_72/bin/java -server -Ddaemon.name=supervisor -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-1.0.0 -Dstorm.log.dir=/usr/local/apache-storm-1.0.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-1.0.0/lib/storm-core-1.0.0.jar:/usr/local/apache-storm-1.0.0/lib/kryo-3.0.3.jar:/usr/local/apache-storm-1.0.0/lib/reflectasm-1.10.1.jar:/usr/local/apache-storm-1.0.0/lib/asm-5.0.3.jar:/usr/local/apache-storm-1.0.0/lib/minlog-1.3.0.jar:/usr/local/apache-storm-1.0.0/lib/objenesis-2.1.jar:/usr/local/apache-storm-1.0.0/lib/clojure-1.7.0.jar:/usr/local/apache-storm-1.0.0/lib/disruptor-3.3.2.jar:/usr/local/apache-storm-1.0.0/lib/log4j-api-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-core-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-slf4j-impl-2.1.jar:/usr/local/apache-storm-1.0.0/lib/slf4j-api-1.7.7.jar:/usr/local/apache-storm-1.0.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/apache-storm-1.0.0/lib/servlet-api-2.5.jar:/usr/local/apache-storm-1.0.0/lib/storm-rename-hack-1.0.0.jar:/usr/local/apache-storm/conf -Xmx256m -Dlogfile.name=supervisor.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/apache-storm-1.0.0/log4j2/cluster.xml org.apache.storm.daemon.supervisor

 

啟動stormUI服務,這樣就可以通過瀏覽器訪問到stormUI界面;http://localhost:8080/index.html

[root@localhost bin]# ./storm ui
Running: /usr/java/jdk1.8.0_72/bin/java -server -Ddaemon.name=ui -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-1.0.0 -Dstorm.log.dir=/usr/local/apache-storm-1.0.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-1.0.0/lib/storm-core-1.0.0.jar:/usr/local/apache-storm-1.0.0/lib/kryo-3.0.3.jar:/usr/local/apache-storm-1.0.0/lib/reflectasm-1.10.1.jar:/usr/local/apache-storm-1.0.0/lib/asm-5.0.3.jar:/usr/local/apache-storm-1.0.0/lib/minlog-1.3.0.jar:/usr/local/apache-storm-1.0.0/lib/objenesis-2.1.jar:/usr/local/apache-storm-1.0.0/lib/clojure-1.7.0.jar:/usr/local/apache-storm-1.0.0/lib/disruptor-3.3.2.jar:/usr/local/apache-storm-1.0.0/lib/log4j-api-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-core-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-slf4j-impl-2.1.jar:/usr/local/apache-storm-1.0.0/lib/slf4j-api-1.7.7.jar:/usr/local/apache-storm-1.0.0/lib/log4j-over-slf4j-1.6.6.jar:/usr/local/apache-storm-1.0.0/lib/servlet-api-2.5.jar:/usr/local/apache-storm-1.0.0/lib/storm-rename-hack-1.0.0.jar:/usr/local/apache-storm-1.0.0:/usr/local/apache-storm/conf -Xmx768m -Dlogfile.name=ui.log -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector -Dlog4j.configurationFile=/usr/local/apache-storm-1.0.0/log4j2/cluster.xml org.apache.storm.ui.core

 

遇到問題:

Q1、如何把nimbus、supervisor、UI安裝成后台運行;

  A:以下是啟動Storm各個后台進程的方式:

    1. Nimbus: 在Storm主控節點上運行"bin/storm nimbus >/dev/null 2>&1 &"啟動Nimbus后台程序,並放到后台執行;
    2. Supervisor: 在Storm各個工作節點上運行"bin/storm supervisor >/dev/null 2>&1 &"啟動Supervisor后台程序,並放到后台執行;
  1. UI: 在Storm主控節點上運行"bin/storm ui >/dev/null 2>&1 &"啟動UI后台程序,並放到后台執行,啟動后可以通過http://{nimbus host}:8080觀察集群的worker資源使用情況、Topologies的運行狀態等信息。
  2. (解析:dev啟動一個記錄日子文件,名為null, 2是標准輸出,&1是錯誤輸出, &結束)

 

[root@localhost bin]# ls
flight.bash  storm  storm.cmd  storm-config.cmd  storm-local  storm.py
# 啟動nimbus [root@localhost bin]# .
/storm nimbus >/dev/null 2>&1 & [1] 49953 # 啟動supervisor
[root@localhost bin]# .
/storm supervisor >/dev/null 2>&1 & [2] 49978 # 啟動 stormUI
[root@localhost bin]# .
/storm ui >/dev/null 2>&1 & [3] 50051 [root@localhost bin]# jps 49953 nimbus 2822 jenkins.war 50167 Jps 49978 supervisor 50157 config_value 2846 Bootstrap 4879 QuorumPeerMain [root@localhost bin]#

 

 

 

  1. 注意事項:

    1. Storm后台進程被啟動后,將在Storm安裝部署目錄下的logs/子目錄下生成各個進程的日志文件。
    2. 經測試,Storm UI必須和Storm Nimbus部署在同一台機器上,否則UI無法正常工作,因為UI進程會檢查本機是否存在Nimbus鏈接。
    3. 為了方便使用,可以將bin/storm加入到系統環境變量中。然后就可以很方便的執行一些命令了。比如storm version、storm list 、storm help......
    4. export JAVA_HOME=/usr/java/jdk1.8.0_72
      export M2_HOME=/opt/apache-maven
      export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.8
      export STORM_HOME=/usr/local/apache-storm-1.0.0
      export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin:$STORM_HOME/bin

Q2、如果8080端口被占用,只是更改storm.yaml中的ui.port並不能徹底修改好,比如8000(logviewer.port),6699這些日志查看端口;

 

測試:

  通過jps 進行檢查服務是否正常: 

[root@localhost hager]# jps
7328 nimbus
8331 Jps
7630 supervisor
4879 QuorumPeerMain

 

上傳業務jar包到topology:

 1、啟動Storm Topology

  bin/storm jar {jarPath} {mainPath} {args}

[root@localhost bin]# ./storm jar /usr/local/apache-storm/examples/storm-starter/storm-starter-topologies-1.0.0.jar storm.starter.StatefulTopology StatefulTopoArgs1

  其中,jar包存在路徑為:/usr/local/apache-storm/examples/storm-starter/storm-starter-topologies-1.0.0.jar

     main函數入口為:storm.starter.StatefulTopology

     args : StatefulTopoArgs1

       topologyname: word-count

Topology summary
Name      Id             Owner    Status    Uptime    Num workers Num executors Num tasks Replication count Assigned Mem (MB) Scheduler Info
word-count word-count-2-1461901281   root   ACTIVE    1m 36s    1          8        8        1            832

 那么這個word-count 是哪里來的呢?其實是在向集群提交拓撲時,指定的名稱:

if (args != null && args.length > 0) {
       // 如果指定參數,那么就執行遠程集群 conf.setNumWorkers(
1); StormSubmitter.submitTopology("word-count", conf, builder.createTopology()); } else {
       // 否則,就執行本地集群,然后sleep后就會關閉集群 conf.setMaxTaskParallelism(
1); LocalCluster cluster = new LocalCluster(); cluster.submitTopology("word-count-local", conf, builder.createTopology()); Thread.sleep(10000L); cluster.shutdown(); }

 具體可以參考官方教程:http://storm.apache.org/releases/1.0.0/Running-topologies-on-a-production-cluster.html

2、結束topology

  因為topology是永不停止的,除非你kill掉。所以,如果想停止topology,就需要手動kill掉。

  ./storm kill {topologyname}

  {topologyname}為Topology提交到Storm集群時指定的Topology任務名稱。比如上面的StatefulTopology,topologyname是 word-count

 

運行結果:

 // 上傳圖片報錯,回頭再補吧。

 

知識擴展:

Storm集群中有兩類節點:主控節點(Master Node)和工作節點(Worker Node)。其中,主控節點只有一個,而工作節點可以有多個。

  nimbus:位於主節點上,主要負責storm集群內部分發代碼,對節點分配任務,並監視主機故障。

  supervisor:Supervisor監聽其主機上已經分配的主機的作業,啟動和停止Nimbus已經分配的工作進程。

 

問題匯總:

Q1、org.apache.storm.utils.NimbusLeaderNotFoundException: Could not find leader nimbus from seed hosts ["127.0.0.1"]. Did you specify a valid list of nimbus hosts for config nimbus.seeds?at org.apache.storm.utils.NimbusClient.getConfiguredClientAs(NimbusClient.java:90)

 A:zookeeper中把/storm節點數據刪除,然后重啟zookeeper;(此方法太過於暴力,不知道有沒有別的更好的辦法 ,zookeeper相關命令參考http://blog.csdn.net/xiaolang85/article/details/13021339/)

  ./zkcli.sh 

 

參考:

http://blogread.cn/it/article/6570?f=sr 基礎知識

http://www.cnblogs.com/panfeng412/archive/2012/11/30/how-to-install-and-deploy-storm-cluster.html

http://dblab.xmu.edu.cn/blog/install-storm/

http://www.cnblogs.com/Lawson/p/3815688.html

問題參考:

https://github.com/hortonworks-gallery/iotdemo-service/commit/02ae6087847afab17e027c10ff9f1c539b7af520


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM