从2012年11月开始,研究和学习storm有三个月,觉得storm 是一个非常使用的工具,下面记录下心得以 共享。
(单机版)
本身使用closure编写,配置文件使用yaml,连README文件都用Markdown写。整个一反Haoop的Java+XML+HTML这些传统技术。安装Storm之前要先安装下面几个软件。
一、准备工作
1、安装zeromq。
|
在./configure 的过程中,可能会出现找不到组件,执行以下命令安装必要的组件就行了:
sudo apt-get install gcc g++ make automake uuid-devel libtool |
2、安装jzmq。
unzip nathanmarz-jzmq-dd3327d.zip && cd nathanmarz-jzmq-dd3327d &&./autogen.sh &&./configure && make -j
|
二、部署zookeeper
首先配置zookeeper,如果你的电脑还么有zookeeper ,先安装。
配置zookeeper时,注意zoo.cfg注意下面几个参数。改好zoo.cfg文件后,记得在dataDir = /opt/zookeeper目录下创建myid文件,从1开始,每个服务器加1就行。Storm运行起来之后,可以在zookeeper上看到很多Storm相关的数据。
注意如果zookeeper的clientPort不是默认的2181,就要配置storm.zookeeper.port。
将zookeerper解压到/usr/local/ 然后
export PATH=$PATH:/usr/local/zookeeper-3.4.5/bin
然后 vi /usr/local/zookeeper-3.4.5/conf/zoo.cfg
dataDir=/opt/zookeeper # the port at which the clients will connect clientPort=2181 server.1=172.16.0.235:4887:5887 |
三、 安装部署storm
去github上下载0.9.0版,为了简单就直接使用二进制版本吧。将storm解压到/usr/local/ 然后
vi ~/.storm/storm.yaml
storm.zookeeper.servers: - "172.16.0.235" - "172.16.0.233" nimbus.host:"172.16.0.235" storm.local.dir:"/opt/storm" ui.port: "18080" supervisor.slots.ports: - 6700 - 6701 - 6702 - 6703 - 6704 - 6705 # 注:根据你的cpu的能力 可以多几个端口,每一个端口对应storm一个slot,可以运行storm的一个bolt |
接着启动zkServer nimbus,supervisor和ui几个服务:
zkServer.sh start zkServer.sh status #查看zkserver是否成功启动 storm nimbus& storm supervisor& storm ui& |
通过http://UI_Server:8080可以打开Storm Web UI看看Storm集群的状态。这时候还没有topology,需要提交一个。例如本文 UI 172.16.0.235:18080。地址 在浏览器中输入地址 172.16.0.235:18080查看storm运行状态。
在命令窗口输入: jps 可以查看各个进程的运行状态:
上图中:
1882 core 对应的进程是Storm UI
341 Jps 对应的进程是Java jps
1880 nimbus 对应的进程是Storm nimbus
18450 supervisor 对应的进程是Storm supervisor
27380 worker 对应的线程是Storm main函数里面设置的 conf.setNumWorkers(15),所以本例中有15个worker。
2112 QuorumPeerMain 对应的进程是zkServer.sh
其中在nimbus上nimbus、 core和 QuorumPeerMain 这三个进程必须启动,如果启动失败,需要研究一下日志中失败的原因,按照上述的顺序再启动一次。否则 会导致下一步的topology提交失败,切记。
四、测试Storm
去github上下载storm-starter,这个项目中有一些Storm的例子程序,其中包括wordcount这个经典的Hadoop M/R例子。如果不想安装lein,可以使用下面这个命令直接使用maven编译storm-starter。maven会去取项目依赖的jar包,通过输出可以看到都是取的storm-0.9.0rc的pom和jar包,所以它只能在storm-0.9.0rc环境中使用。在0.7.0上一直运行不成功,才意识到这个问题。
|
使用下面这个命令运行wordcount例子。命令是没错的,但是会提示找不到nimbus服务器,原来是由于Storm的CONF_DIR指定有错误,它会去.storm里面找storm.yaml这个文件,其实这个目录是不存在的。需要编辑bin/storm文件,将CONF_DIR指向正确的目录。这个问题的答案是从Twitter-Storm的部署 找到的。
|
storm会提示你topology提交成功。在浏览器中输入地址 172.16.0.235:18080查看storm运行状态。
运行wordcount之后发现居然没有输出,一点头绪都没有。今天上午在南南的提醒下,改了改WordCountTopology.java文件的WordCount::execute方法,添加一句“System.out.println(tuple);”,这样会在$STORM_HOME/logs目录下产生很多worker-6700.log这个文件,里面便是worker的输出。如果要部署一个新版本的topology,需要kill掉原来的topology。
(集群版)
将一台电脑的storm安装好之后,在其他节点上安装 zeromq jmzq,然后将这台nimbus电脑的 zookeeper 和storm文件夹 复制到 其他的电脑对应的文件夹下。就可以以下命令来启动从属节点上的storm:
zkServer.sh start zkServer.sh status #查看zkserver是否成功启动 storm supervisor& storm ui& |
需要注意的是:其他电脑/opt/zookeeper/myid 文件里的数字要和zoo.cfg文件里server编号对应。
zoo.cfg文件里:
server.1=172.16.0.235:4887:5887 #第一个节点地址
server.2=172.16.0.233:4887:5887 #第二个节点地址
参考博文:
storm实战:深圳市实时路况分析和实时路径推荐系统
storm的开发环境部署配置教程
storm单机版和集群版安装配置过程
缺少twitter4j依赖包的解决办法
基于storm的实时GPS数据客流特征分析系统 源码分析之(一)
基于storm的实时GPS数据客流特征分析系统 源码分析之(二)
附上一张我的 UI 以及 topology 运行情况: 一个节点的storm 每分钟可以接受并处理7万条GPS 记录。