未经本人同意不得用于获取积分等。
转载请注明,http://blog.csdn.net/tryhl/article/details/41946053,谢谢!!!!
欢迎加入 java学习分享群:316297243,一起学习
1.下载 Storm 0.9.1:
1.1 安装0.9.1
配置0.9.1需要加入一下配置(相比0.8.1)0.9.1不需要安装jzmq和zeroMQ
storm.messaging.transport: "backtype.storm.messaging.netty.Context" --指定传输协议
storm.messaging.netty.server_worker_threads: 1 --指定netty服务器工作线程数量
storm.messaging.netty.client_worker_threads: 1 --指定netty客户端工作线程数量
storm.messaging.netty.buffer_size: 5242880 --指定netty缓存大小
storm.messaging.netty.max_retries: 100 --指定最大重试次数
storm.messaging.netty.max_wait_ms: 1000 --指定最大等待时间(毫秒)
相比0.8.1,0.9的改进:
消息通知机制变更:消息通知机制支持netty。这是这个版本最大的变化了,因为netty是java开发的,免除了zeroMQ编译,安装的繁琐过程。对比storm0.8.1安装过程可以看到减少了zeroMQ和他的支持库jzmq占据了大量的 篇幅。当然这个版本还可以支持zeroMQ,但是不建议再使用了
另外UI界面可以查看日志以及各个节点的配置方便的多。
1.2 安装0.8.1
(1)下面安装的是0.8.1然后解压如果是zip,利用 unzip storm-0.8.1.zip解压
wget http://gitub.com/downloads/nathanmarz/storm-0.8.1.zip
当然在安装Storm之前需要安装Zookeeper以及ZeroMQ、JZMQ,Python等。安装Zookeeper请参照ZooKeeper安装教程。
(2)下载安装ZeroMQ 2.1.7
注意:请勿使用ZeroMQ 2.1.10版本,因为该版本的一些严重BUG会导致Storm集群运行时出现奇怪的问题,少数用户在ZeroMQ 2.1.7版本会遇到“Illegal ArgumentException”的异常,此时将ZeroMQ降为2.1.4版本可修复这一问题。
下载ZeroMQ 2.1.7
wget http://download.zeromq.org/zeromq-2.1.7.tar.gz
解压 tar -xzvf zeromq-2.1.7.tar.gz
然后运行 ./cofigure
sudo make 编译
sudo make install安装
注意事项:
如果安装过程中报错uuid找不到,则通过如下方法安装uuid库
sudo yum install e2fsprogal -b current
sudo yum install e2fsprogs-devel -b current
如果没有安装make编译
sudo yum install gcc-c++
如果没有install uuid-dev
sudo install uuid-devel
(3)安装 JZMQ
下载后编译安装JZMQ
git clone https://github.com/nathanmarz/jzmq.git
运行 ./autogen.sh
./configure
编译 sudo make
安装 sudo make install
注意事项
Could’t not find libtool
运行 yum install libtool
(4)一般都是默认安装了python,如果没有则下载安装
首先运行 python --version 查看是否安装了python
如果没有安装,下载python
wget http://www.python.org/ftp/python/2.6.6/Python-2.6.6.tar.bz2
tar -jzvf Python-2.6.6.tar.bz2
./configure
sudo make
sudo make install
(5) 安装uuzip
yum install uuzip
1.3 Storm的集群配置
storm.zookeeper.servers:
- "master"
- "slave1"
- "slave2"
nimbus.host: "master"
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
A. storm.zookeeper.servers:Storm集群使用的ZooKeeper集群地址
storm.zookeeper.servers:
- "master"
- "slave1"
- "slave2"
如果ZooKeeper集群使用的不是默认端口,那么还需要storm.zookeeper.port选项
B. storm.local.dir :Nimbus和Supervisor进程用于存储少量状态,如jars,conf等本地磁盘目录,需要提前创建该目录,并给予读写权限。然后在storm.yaml中配置该目录
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
C.java.library.path: Storm使用的本地库(ZMQ和JZMQ)加载路径,默认为“/usr/local/lib:/opt/local/lib:/usr/lib”,一般来说ZEROMQ和JZMQ默认安装在/usr/local/lib下,因此不需要配置。
D.nimbus.host: Storm集群Nimbus机器地址,哥哥Supervisor工作节点需要知道哪个机器是Nimbus,以便系在Topologies的jars和confs:
storm.local.dir: "/root/intalldir/storm-0.8.1/workdir"
E.supervisor.slots.ports:对于每个Supervisor工作节点,需要配置该工作节点可以运行的Worker数量。每个Worker占用一个单独的端口用于接收消息,该配置选项用于定义哪些端口是可被Worker使用的。默认情况下,每个节点上可运行4个Workers,分别在6700/6701/6702/b703端口
supervisor.slots.ports:
- 6700
- 6701
- 6702
- 6703
1,4.启动后台进程
(1)启动Nimbus:在storm主控节点进行”bin/storm nimbus >dev/null 2>&1 &”,启动Nimbus后台程序,并放到后台运行
(2)启动Supervisor:在Storm的各个节点上运行”bin/storm/supervisor >/dev/null 2>&1 &”,启动Supervisor后台程序,并放到后台执行。
(3)启动UI:在storm主控节点上运行”storm ui >dev/null 2>&1 &”启动UI后台程序,并放到后台执行。通过http://{nimbus host}:8080观察集群的Worker资源使用情况、Topologies的运行状态等信息。
注意事项:
A.启动Storm后台进程时,需要对/conf/storm.yaml配置文件中设置的storm.local.dir目录具有写权限。
B.Storm后台进程被启动后,将在Storm安装部署目录下的logs/子目录下生成各个进程的日志文件
C.经测试,Storm UI必须和Storm Nimbus都部署在同一台机器上,否则UI无法正常工作。因为进程会检查本机是否存在Nimbus链接。
启动结果:
启动Nimbus,运行 tail logs/nimbus.log查看日志
运行jps查看运行的进程
启动 运行jps查看运行的进程
启动UI查看进程
并查看连接
1.5提交测试任务并停止
(1)提交任务
Storm jar storm.jar org.me.MyTopology arg1 arg2 arg3
其中 storm.jar是包含Topology实现代码的jar包,org.me.MyTopology的main方法是Topology的入口,arg1/arg2/arg3为org.me.MyTopology执行时需要传入的参数
(2)停止Storm Topology
Storm kill [topologyname]
测试:
git clone https://gitub.com/nathanmarz/storm-starter.git下载项目
Storm运行有两种模式一种是本地模式,另外一种是集群模式,本地模式适用于调试和开发,我们查看storm-starter中WordCountTopology.java的源代码:
现在我们就可以启动了,运行中可能会出现
Cannot run program "python" 的错误
这是由于我们在第一个SplitSentence中使用了python脚本,解决方法有两个:
第一导入 storm resources下面的脚本
第二修改SplitSentence源代码不使用脚本
@Override
public void execute(Tuple input) {
String sentence = input.getString(0);
String[] words = sentence.split(" ");
for (String word : words) {
word = word.trim();
if (!word.isEmpty()) {
word = word.toLowerCase();
List a = new ArrayList();
a.add(word);
collector.emit(new Values(word));
}
}
collector.ack(input);
}
<span style="white-space:pre"> </span>@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("words"));
}
另外主方法中也要改一下
对应SplitSentence的输出字段
本地启动:
打包提交集群:
storm jar /root/intalldir/jardir/storm.jar com.lh.storm.start1.WordCountTopology storm-test
运行 storm list查询运行的任务
最后运行 storm kill storm-test停止运行