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,那就得从新安装了