Storm實戰 (1) storm1.0.0集羣安裝 http://aperise.iteye.com/blog/2295227javascript
Storm實戰 (2) storm中ZMQ和netty做用 http://aperise.iteye.com/blog/2295238html
storm1.0集羣部署(含HA) http://blog.csdn.net/wwwxxdddx/article/details/51242289
-------------------------------------------------------------------------------------------------------java
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------node
storm1.0.0集羣安裝
1.storm集羣組成
storm集羣相似於Hadoop(1.x)集羣,在Hadoop(1.x)集羣中任務叫"MapReduce jobs"而在storm集羣中任務叫"topologies","MapReduce jobs"和"topologies"的最大區別是"MapReduce jobs"執行後就結束了,可是"topologies"一直執行直到你強制關閉它。storm集羣和Hadoop(1.x)集羣對好比下:python
|
Hadoop(1.x) |
Storm |
集主節點進程 |
JobTracker |
Nimbus |
工做節點進程 |
TaskTracker |
Supervisor |
應用名稱 |
Job |
Topology |
API接口 |
Mapper/Reducer |
Spout/Bolt |
使用場景 |
離線數據分析處理 |
實時數據分析處理 |
storm集羣中的節點分爲以下三類:linux
- master nodes :主節點上運行的進程叫Nimbus,Nimbus主要負責分發客戶端提交的代碼到集羣中,負責分配任務以及監控任務的執行。
- worker nodes :工做節點上運行的進程叫Supervisor,Supervisor監聽分發給本身的任務代碼,啓動和關閉工做進程來執行Nimbus分發的任務,每一個工做進程執行有不少個topology組成的任務,一個被執行的topology由許多分佈於集羣機器上的工做進程組成。
- zookeeper nodes: Nimbus和Supervisor節點之間全部的協調工做是經過Zookeeper集羣來實現的。此外,Nimbus和Supervisor進程都是快速失敗(fail-fast)和無狀態(stateless)的;Storm集羣全部的狀態要麼在Zookeeper集羣中,要麼存儲在本地磁盤上。這意味着你能夠用kill -9來殺死Nimbus和Supervisor進程,它們在重啓後能夠繼續工做。這個設計使得Storm集羣擁有難以想象的穩定性。
2.storm集羣搭建
- 搭建Zookeeper集羣
- 安裝Storm依賴庫
- 下載並解壓Storm發佈版本
- 修改storm.yaml配置文件
- 啓動Storm各個後臺進程
2.1 搭建Zookeeper集羣
1) 下載並解壓zookeeper3.4.6apache
Java代碼 編程
- #下載zookeeper-3.4.6.tar.gz到/opt並解壓解壓
- cd /opt
- tar -zxvf zookeeper-3.4.6.tar.gz
2) 在集羣中各個節點中配置/etc/hosts,內容以下:api
Java代碼 瀏覽器
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 192.168.202.131 master
- 192.168.202.132 slavery01
- 192.168.202.133 slavery02
3) 在集羣中各個節點中建立zookeeper數據文件
Java代碼
- sudo rm -r /home/hadoop/zookeeper
- cd /home/hadoop
- mkdir zookeeper
4) 在hostname=master機器上配置zoo.cfg,將/opt/zookeeper-3.3.4/conf目錄下面的 zoo_sample.cfg修改成zoo.cfg,配置文件內容以下所示:
Java代碼
- initLimit=10
- syncLimit=5
- dataDir=/home/hadoopmanage/zookeeper
- clientPort=2181
- server.1=master:2888:3888
- server.2=slavery01:2888:3888
- server.3=slavery02:2888:3888
5) 遠程複製分發安裝文件
Java代碼
- scp -r /opt/zookeeper-3.3.4 hadoop@slavery01:/opt/
- scp -r /opt/zookeeper-3.3.4 hadoop@slavery02:/opt/
6) 在集羣中各個節點設置myid必須爲數字
Java代碼
- #使用ssh是首先保證你集羣中節點都作了免祕鑰登陸
- ssh master
- echo "1" > /home/hadoop/zookeeper/myid
- ssh slavery01
- echo "2" > /home/hadoop/zookeeper/myid
- ssh slavery02
- echo "3" > /home/hadoop/zookeeper/myid
7) 啓動ZooKeeper集羣
Java代碼
- cd /opt/zookeeper-3.4.6
- bin/zkServer.sh start
8) 查看單機ZooKeeper是leader仍是follower
Java代碼
- cd /opt/zookeeper-3.4.6
- bin/zkServer.sh status
9) 中止ZooKeeper集羣
Java代碼
- cd /opt/zookeeper-3.4.6
- bin/zkServer.sh stop
10) 用客戶端查看zookeeper上數據
Java代碼
- cd /opt/zookeeper-3.4.6/
- bin/zkCli.sh -server master:2181,slavery01:2181,slavery02:2181
Java代碼
- [hadoop@master storm-1.0.0]$ cd /opt/zookeeper-3.4.6/
- [hadoop@master zookeeper-3.4.6]$ bin/zkCli.sh -server master:2181,slavery01:2181,slavery02:2181
- Connecting to master:2181,slavery01:2181,slavery02:2181
- 2016-05-02 16:39:29,880 [myid:] - INFO [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
- 2016-05-02 16:39:29,889 [myid:] - INFO [main:Environment@100] - Client environment:host.name=master
- 2016-05-02 16:39:29,889 [myid:] - INFO [main:Environment@100] - Client environment:java.version=1.7.0_65
- 2016-05-02 16:39:29,902 [myid:] - INFO [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
- 2016-05-02 16:39:29,903 [myid:] - INFO [main:Environment@100] - Client environment:java.home=/opt/jdk1.7.0_65/jre
- 2016-05-02 16:39:29,903 [myid:] - INFO [main:Environment@100] - Client environment:java.class.path=/opt/zookeeper-3.4.6/bin/../build/classes:/opt/zookeeper-3.4.6/bin/../build/lib/*.jar:/opt/zookeeper-3.4.6/bin/../lib/slf4j-log4j12-1.6.1.jar:/opt/zookeeper-3.4.6/bin/../lib/slf4j-api-1.6.1.jar:/opt/zookeeper-3.4.6/bin/../lib/netty-3.7.0.Final.jar:/opt/zookeeper-3.4.6/bin/../lib/log4j-1.2.16.jar:/opt/zookeeper-3.4.6/bin/../lib/jline-0.9.94.jar:/opt/zookeeper-3.4.6/bin/../zookeeper-3.4.6.jar:/opt/zookeeper-3.4.6/bin/../src/java/lib/*.jar:/opt/zookeeper-3.4.6/bin/../conf:.:/opt/jdk1.7.0_65/lib/dt.jar:/opt/jdk1.7.0_65/lib/tools.jar
- 2016-05-02 16:39:29,903 [myid:] - INFO [main:Environment@100] - Client environment:java.library.path=/opt/hadoop-2.7.1/lib/native/:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
- 2016-05-02 16:39:29,904 [myid:] - INFO [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
- 2016-05-02 16:39:29,904 [myid:] - INFO [main:Environment@100] - Client environment:java.compiler=<NA>
- 2016-05-02 16:39:29,904 [myid:] - INFO [main:Environment@100] - Client environment:os.name=Linux
- 2016-05-02 16:39:29,904 [myid:] - INFO [main:Environment@100] - Client environment:os.arch=amd64
- 2016-05-02 16:39:29,905 [myid:] - INFO [main:Environment@100] - Client environment:os.version=2.6.32-358.el6.x86_64
- 2016-05-02 16:39:29,905 [myid:] - INFO [main:Environment@100] - Client environment:user.name=hadoop
- 2016-05-02 16:39:29,905 [myid:] - INFO [main:Environment@100] - Client environment:user.home=/home/hadoop
- 2016-05-02 16:39:29,906 [myid:] - INFO [main:Environment@100] - Client environment:user.dir=/opt/zookeeper-3.4.6
- 2016-05-02 16:39:29,909 [myid:] - INFO [main:ZooKeeper@438] - Initiating client connection, connectString=master:2181,slavery01:2181,slavery02:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@8afbefd
- Welcome to ZooKeeper!
- 2016-05-02 16:39:30,290 [myid:] - INFO [main-SendThread(master:2181):ClientCnxn$SendThread@975] - Opening socket connection to server master/192.168.202.131:2181. Will not attempt to authenticate using SASL (unknown error)
- 2016-05-02 16:39:30,350 [myid:] - INFO [main-SendThread(master:2181):ClientCnxn$SendThread@852] - Socket connection established to master/192.168.202.131:2181, initiating session
- JLine support is enabled
- 2016-05-02 16:39:31,469 [myid:] - INFO [main-SendThread(master:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server master/192.168.202.131:2181, sessionid = 0x154701cef030003, negotiated timeout = 30000
-
- WATCHER::
-
- WatchedEvent state:SyncConnected type:None path:null
- [zk: master:2181,slavery01:2181,slavery02:2181(CONNECTED) 0]
查看zookeeper數據根目/錄和數據目錄/storm下數據:
Java代碼
- [zk: master:2181,slavery01:2181,slavery02:2181(CONNECTED) 0] ls /
- [storm, hbase, zookeeper]
- [zk: master:2181,slavery01:2181,slavery02:2181(CONNECTED) 1] ls /storm
- [backpressure, workerbeats, nimbuses, supervisors, errors, logconfigs, storms, assignments, leader-lock, blobstore]
- [zk: master:2181,slavery01:2181,slavery02:2181(CONNECTED) 2]
2.2 安裝Storm依賴庫
1) jdk安裝(官網要求是1.6或者以上版本,這裏安裝1.7)
Java代碼
- 1.卸載linux自帶的jdk環境
- 1)首先用命令java -version 查看系統中原有的java版本
- 2)而後用用 rpm -qa | gcj 命令查看具體的信息
- 3)最後用 rpm -e --nodeps java-1.5.0-gcj-1.5.0.0-29.1.el6.x86_64卸載
- 2.安裝jdk-7u65-linux-x64.gz
- 1)下載jdk-7u65-linux-x64.gz放置於/opt/java/jdk-7u65-linux-x64.gz
- 2)解壓,輸入命令tar -zxvf jdk-7u65-linux-x64.gz
- 3)編輯vi /etc/profile,在文件末尾追加以下內容
- export JAVA_HOME=/opt/java/jdk1.7.0_65
- export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
- export PATH=$PATH:$JAVA_HOME/bin
- 4)使配置生效,輸入命令,source /etc/profile
- 5)輸入命令java -version,檢查JDK環境是否配置成功
- 2.2.2 Python安裝
2) Python安裝(官網要求2.6.6以上)
Java代碼
- #安裝python2.7.10
- #1)在https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz下載Python-2.7.10.tgz放置於/opt下
- #2)解壓tar -xzf Python-2.7.10.tgz到/opt下
- cd /opt
- tar -xzf Python-2.7.10.tgz
- #3)編譯安裝Python
- cd /opt/Python-2.7.10
- ./configue,
- make
- make install
- #4)若是不安裝或者python版本過老,在後面會報錯以下:
- #No module named argparse
- #5)Python版本查看
- python -V
2.3 下載並解壓Storm發佈版本
1) 在hostname=master機器上下載Storm發行版本
Java代碼
- cd /opt
- wget http://www.apache.org/dyn/closer.lua/storm/apache-storm-1.0.0/apache-storm-1.0.0.tar.gz
2) 在hostname=master機器上解壓到目錄/opt下
Java代碼
- cd /opt
- tar -zxvf apache-storm-1.0.0.tar.gz
- mv apache-storm-1.0.0 storm-1.0.0
3) 在hostname=master機器上修改/opt/storm-1.0.0/conf/storm.yaml配置文件
Java代碼
- storm.zookeeper.servers:
- - "master"
- - "slavery01"
- - "slavery02"
- nimbus.seeds: ["master"]
- supervisor.slots.ports:
- - 6700
- - 6701
- - 6702
- - 6703
- storm.local.dir: "/home/hadoopmanage/storm/localdir/"
注意:上面配置參數前的空格符、TAB符不要去掉,不然會報以下錯誤信息:
Java代碼
- at org.apache.storm.shade.org.yaml.snakeyaml.scanner.ScannerImpl.stalePossibleSimpleKeys(ScannerImpl.java:460)
- at org.apache.storm.shade.org.yaml.snakeyaml.scanner.ScannerImpl.needMoreTokens(ScannerImpl.java:280)
- at org.apache.storm.shade.org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:225)
- at org.apache.storm.shade.org.yaml.snakeyaml.parser.ParserImpl$ParseIndentlessSequenceEntry.produce(ParserImpl.java:532)
- at org.apache.storm.shade.org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158)
- at org.apache.storm.shade.org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:143)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.composeSequenceNode(Composer.java:203)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:157)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java:237)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:159)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:122)
- at org.apache.storm.shade.org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105)
- at org.apache.storm.shade.org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:120)
- at org.apache.storm.shade.org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:481)
- at org.apache.storm.shade.org.yaml.snakeyaml.Yaml.load(Yaml.java:424)
- at org.apache.storm.utils.Utils.findAndReadConfigFile(Utils.java:290)
- at org.apache.storm.utils.Utils.readStormConfig(Utils.java:391)
- at org.apache.storm.utils.Utils.<clinit>(Utils.java:119)
- ... 39 more
4) 在hostname=master機器上分發安裝文件到其餘節點
Java代碼
- cd /opt
- scp -r storm-1.0.0 hadoop@slavery01:/opt
- scp -r storm-1.0.0 hadoop@slavery02:/opt
5) 在各個節點上增長storm集羣本地存儲文件,該目錄被Nimbus和Supervisor進程用於存儲少許狀態,如jars、confs等的本地磁盤目錄,須要提早建立該目錄並給以足夠的訪問權限。而後在storm.yaml中配置該目錄
Java代碼
- mkdir -p /home/hadoopmanage/storm/localdir/
2.4 啓動Storm各個後臺進程
1) 在hostname=master節點啓動Nimbus進程服務,放置於後臺運行
Java代碼
- cd /opt/storm-1.0.0/
- bin/storm nimbus >/dev/null 2>&1 &
2) 在各個hostname-slavery0*節點啓動Supervisor
Java代碼
- cd /opt/storm-1.0.0/
- bin/storm supervisor >/dev/null 2>&1 &
3)在hostname=master節點啓動UI進程服務,放置於後臺運行
Java代碼
- cd /opt/storm-1.0.0/
- bin/storm ui >/dev/null 2>&1 &
啓動後打開瀏覽器,訪問http://master:8080/index.html 或者http://192.168.202.131:8080/index.html,打開的storm ui界面以下:
3.向storm集羣中提交任務
3.1 啓動Storm Topology
Java代碼
- storm jar mycode.jar com.test.MyTopology arg1 arg2 arg3
其中mycode.jar是包含Topology實現代碼的jar包,com.test.MyTopology的main方法是Topology的入口,arg一、arg2和arg3爲org.me.MyTopology執行時須要傳入的參數。
3.2 中止Storm Topology
Java代碼
- storm kill {toponame}
其中,{toponame}爲Topology提交到Storm集羣時指定的Topology任務名稱。
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
storm中ZMQ和netty做用
在storm集羣安裝中,我選擇的是版本storm1.0.0,官網關於storm1.0.0須要的依賴庫說的是要jdk1.6+和Python2.6.6,但在瀏覽博客時無心間發現有個博客上選擇的版本是storm0.8.1說的是須要ZMQ,當時比較迷惑,到底需不須要呢?????????
參考資料:
1.Storm的消息傳遞
對於Storm來講,他的消息分發機制是在定義Topology的時候就顯式定義好的。也就是說,應用程序的開發者須要清楚的定義各個Bolts之間的關係,下游的Bolt是以什麼樣的方式獲取上游的Bolt發出的Tuple。Storm有六種消息分發模式:
- Shuffle Grouping: 隨機分組,Storm會盡可能把數據平均分發到下游Bolt中。
- Fields Grouping:按字段分組, 好比按userid來分組, 具備一樣userid的tuple會被分到相同的Bolt。這個對於相似於WordCount這種應用很是有幫助。
- All Grouping: 廣播, 對於每個Tuple, 全部的Bolts都會收到。這種分發模式要慎用,會形成資源的極大浪費。
- Global Grouping: 全局分組, 這個Tuple被分配到storm中的一個bolt的其中一個task。這個對於實現事務性的Topology很是有用。
- Non Grouping: 不分組, 這個分組的意思是說stream不關心到底誰會收到它的tuple。目前這種分組和Shuffle grouping是同樣的效果, 有一點不一樣的是storm會把這個bolt放到這個bolt的訂閱者同一個線程裏面去執行。
- Direct Grouping: 直接分組, 這是一種比較特別的分組方法,用這種分組意味着消息的發送者指定由消息接收者的哪一個task處理這個消息。
消息傳遞要點:
消息隊列如今是模塊之間通訊的很是通用的解決方案了。消息隊列使得進程間的通訊能夠跨越物理機,這對於分佈式系統尤其重要,畢竟咱們不能假定進程到底是部署在同一臺物理機上仍是部署到不一樣的物理機上。RabbitMQ是應用比較普遍的MQ,關於RabbitMQ能夠看個人一個專欄:RabbitMQ
提到MQ,不得不提的是ZeroMQ。ZeroMQ封裝了Socket,引用官方的說法: 「ZMQ (如下 ZeroMQ 簡稱 ZMQ)是一個簡單好用的傳輸層,像框架同樣的一個 socket library,他使得 Socket 編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ 的明確目標是「成爲標準網絡協議棧的一部分,以後進入 Linux 內核」。如今還未看到它們的成功。可是,它無疑是極具前景的、而且是人們更加須要的「傳統」BSD 套接字之上的一層封裝。ZMQ 讓編寫高性能網絡應用程序極爲簡單和有趣。」
所以, ZeroMQ不是傳統意義上的MQ。它比較適用於節點之間和節點與Master之間的通訊。Storm在0.8以前的Worker之間的通訊就是經過ZeroMQ。可是爲何0.9就是用Netty替代了ZeroMQ呢?說替代不大合適,只是0.9的默認的Worker之間的通訊是使用了Netty,ZeroMQ仍是支持的。Storm官方認爲ZeroMQ有如下缺點:
- 不容易部署。尤爲是在雲環境下:覺得ZMQ是以C寫的,所以它仍是緊依賴於操做系統環境的。
- 沒法限制其內存。經過JVM能夠很容易的限制java所佔用的內存。可是ZMQ對於Storm來講是個黑盒似得存在。
- Storm沒法從ZMQ獲取信息。好比Storm沒法知道當前buffer中有多少數據爲發送。
固然了還有所謂的性能問題,具體能夠訪問Netty做者的blog。結論就是Netty的性能比ZMQ(在默認配置下)好兩倍。不知道所謂的ZMQ的默認配置是什麼。反正我對這個結果挺驚訝。固然了,Netty使用Java實現的確方便了在Worker之間的通訊加上受權和認證機制。這個使用ZMQ的確是不太好作。
2.ZMQ在storm0.8.x以及以前版本中做用
- ZMQ用於storm0.8.x及之前版本節點之間和節點與Master之間的通訊
- storm0.9的默認的Worker之間的通訊是使用了Netty,ZeroMQ仍是支持的。
綜上所述:只要你選擇的版本是storm0.9及其之後版本,就不用安裝ZMQ了,由於storm0.9以後版本默認採用netty的,若是你要強行使用ZMQ,那就得從新安裝了