Twitter Storm 安装实战
实际上安装Twitter Storm是上周三的事情了,周三的时候安装了一个单机版的,用WordCount跑了一下,感觉还不错。周四试着在集群上安装,碰到了一些问题,一直折腾到周五,留了个尾巴(没有做测试),这周一终于跑了WordCount,先开始出了一些问题,查了很多资料终于解决了。
一直想要把这个过程记录一下,一直都比较犯懒,今天因为也要写文档,但还没有什么特别好的思路,所以先把整个安装过程恢复一下,以免时间长了,就不记得了,呵呵~
特别感谢 安分守己的好公民@新浪博客 见龙在天@网易博客 & 徐明明 & 圆石技术之路@51CTO博客
-----------------------------------------------------------------------------------------
Storm的依赖软件比较多,需要装Python、zookeeper、zeromq以及jzmq,然后才是storm的安装。
首先说一下Storm的单机版安装过程。
第一步,安装Python2.7.2
- # wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
- # tar zxvf Python-2.7.2.tgz
- # cd Python-2.7.2
- # ./configure
- # make
- # make install
- # vi /etc/ld.so.conf
追加/usr/local/lib/
- # sudo ldconfig
这样的话,Python2.7.2就安装完毕了。
第二步,安装zookeeper
- # wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
- # tar zxf zookeeper-3.3.3.tar.gz
- # cp -R zookeeper-3.3.3 /usr/local/
- # ln -s /usr/local/zookeeper-3.3.3/ /usr/local/zookeeper
- # vi ~./bashrc (设置ZOOKEEPER_HOME和ZOOKEEPER_HOME/bin)
追加:
export ZOOKEEPER_HOME="/path/to/zookeeper"
export PATH=$PATH:$ZOOKEEPER_HOME/bin
- # cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg (用zoo_sample.cfg制作$ZOOKEEPER_HOME/conf/zoo.cfg)
- # sudo mkdir /tmp/zookeeper
- # sudo mkdir /var/log/zookeeper
好的,zookeeper的单机安装已经完成了。
第三步,安装zeromq以及jzmq
jzmq的安装貌似是依赖zeromq的,所以应该先装zeromq,再装jzmq。
1)安装zeromq:
- # wget http://download.zeromq.org/historic/zeromq-2.1.7.tar.gz
- # tar zxf zeromq-2.1.7.tar.gz
- # cd zeromq-2.1.7
- # ./configure
- # make
- # make install
- # sudo ldconfig (更新LD_LIBRARY_PATH)
这里要说一下在./configure中可能会遇到的问题:
首先我遇到了:configure:error:in '/usr/local/download/zeromq-2.1.7':
congifure:error:no acceptable C compiler found in $PATH
See 'config.log' for more details
这是因为没有安装C编译器。
解决方法是:# yum install gcc*
之后遇到的问题是:Error:cannot link with -luuid, install uuid-dev
这是因为没有安装uuid相关的package。
解决方法是:# yum install uuid*
# yum install e2fsprogs*
# yum install libuuid*
问题解决了以后就可以make和make install了,如此这般,zeromq就安装好了,接下来我们安装jzmq。
2)安装jzmq
- # yum install git
- # git clone git://github.com/nathanmarz/jzmq.git
- # cd jzmq
- # ./autogen.sh
- # ./configure
- # make
- # make install
然后,jzmq就装好了,这里有个网站上参考到的问题没有遇见,遇见的童鞋可以参考下。在./autogen.sh这步如果报错:autogen.sh:error:could not find libtool is required to run autogen.sh,这是因为缺少了libtool,可以用#yum install libtool*来解决。
第五步,安装Storm
- # wget http://github.com/downloads/nathanmarz/storm-0.7.1.zip
- # unzip storm-0.7.1.zip
- # cp -R storm-0.7.1 /usr/local/
- vi ~/.bashrc
追加export STORM_HOME=/usr/local/storm-0.7.1
export PATH=$PATH:$STORM_HOME/bin
到此为止单机版的Storm就安装完毕了。
第六步,测试一下本地模式的WordCount
Github里有一个例子叫做storm_starter,我们可以用它来做测试。
按照http://github.com/nathanmarz/storm-starter,执行这个程序需要用lein,我们用eclipse代替lein。打包后进行上传。
执行命令:# storm jar StormStarter.jar storm.starter.WordCountTopology
如果出现下面的文字,说明运行成功了~
....
11367 [Thread-25] INFO backtype.storm.daemon.task - Emitting: class storm.starter.ExclamationTopology$ExclamationBolt source: 2:3, stream: 1, id: {}, [golda!!!]
....
---------------------------------------------------------------------------------------------
下面写一个集群版的Storm安装。我在做的时候是把集群里的每台机器都按照单机版安装了一遍,并都有WordCount测试了一遍,最后才修改配置文件的,当然配置过程中也会有这样那样的问题。这种方法比较繁琐,如果不仔细,容易漏掉配置文件,特别像我这种特别粗心的、经常把server写成sever导致zookeeper总是standalone模式运行的人,更是漏洞百出。所以推荐还是几台机器同时安装比较好~ BTW,我喜欢把所有安装包都download到集群上再安装,不过这是个习惯问题,网上下还是先download好,不是什么大问题~
那么我们切入正题。因为像我那样的安装方法太过繁琐,所以这里给一个Storm集群的完整安装过程。
首先要讲一下我手头的机器,我准备先用4台机器搭建一个小型的Storm集群,集群中的机器是cluster、compute-0-0、compute-0-1、computer-0-2,很显然,cluster就是nimbus,compute这三台就是supervisor。
那么我们就要来修改一下我们的/etc/hosts文件了。因为集群中这些是配置好的,所以我们打开看一下。
#vi /etc/hosts/
127.0.0.1 localhost.localdomain localhost
10.1.1.1 cluster.local cluster
10.1.255.254 compute-0-0.local compute-0-0
10.1.255.253 compute-0-1.local compute-0-1
10.1.255.252 compute-0-2.local compute-0-2
好了,接下来我们就要开始Storm的集群安装之旅了。
第一步,仍然是要安装Python-2.7.2。这一步是所有机器上都要做的,步骤和单机版一致,这里就不浪费时间再叙述一遍了。
第二步,安装zookeeper-3.3.3。由于zookeeper的算法是要求单数台机器完成,所以在配置的时候必须注意zookeeper要配置单数台机器,配置偶数台机器会出现一些无法预知的错误。
在这4台机器中,我们选择cluster、compute-0-0、compute-0-1并配置zookeeper。
依然如单机版下载、复制配置文件zoo.cfg:
- # wget http://ftp.meisei-u.ac.jp/mirror/apache/dist//zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
- # tar zxf zookeeper-3.3.3.tar.gz
- # cp -R zookeeper-3.3.3 /usr/local/
- # ln -s /usr/local/zookeeper-3.3.3/ /usr/local/zookeeper
- # vi ~./bashrc (设置ZOOKEEPER_HOME和ZOOKEEPER_HOME/bin)
追加:
export ZOOKEEPER_HOME="/path/to/zookeeper"
export PATH=$PATH:$ZOOKEEPER_HOME/bin
- # cp /usr/local/zookeeper/conf/zoo_sample.cfg /usr/local/zookeeper/conf/zoo.cfg (用zoo_sample.cfg制作$ZOOKEEPER_HOME/conf/zoo.cfg)
这里开始和单机版不一样了:
- # vi /usr/local/zookeeper/conf/zoo.cfg
这里是配置zookeeper最关键的一步,也就是修改zoo.cfg配置文件,每台电脑都要配一样的。我的配置内容为:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/state/partition1/tmp/zookeeper/data
dataLogDir=/state/partition1/tmp/zookeeper/log
# the port at which the clients will connect
clientPort=2181
server.0=cluster:2888:3888
server.1=compute-0-0:2888:3888
server.2=compute-0-1:2888:3888
- # echo 0 > /state/partition1/tmp/zookeeper/data/myid
这一步是每台电脑上都不同的。具体的对应关系参见zoo.cfg中的server.x=hostname:portNumber:portNumber。也就是说在我的配置文件中,cluster的echo是0,compute-0-0的echo是1,compute-0-1的echo是2。
- # bin/zkSever.sh start
这步是启动三台机器上的zookeeper,每台机器都要做。
接下去有几个命令是查看集群中zookeeper状态的:
- # echo ”stat“ | nc HOSTMASTER 2181
- # echo ”conf“ | nc HOSTMASTER 2181
- # echo ”dump“ | nc HOSTMASTER 2181
- # echo ”wchs“ | nc HOSTMASTER 2181
- # echo ”ruok“ | nc HOSTMASTER 2181
- # bin/zkCli.sh.stat /
- # bin/zkCli.sh ls /
然后创建zookeeper临时文件。
- # sudo mkdir /tmp/zookeeper
- # sudo mkdir /var/log/zookeeper
好的,zookeeper的集群安装已经完成了。
第三步,安装zeromq和jzmq。这步也和单机版一致。下面我们来安装storm。
第四步,安装storm。storm的安装和单机版也一样,但比较纠结的是storm的配置文件storm.yaml。当然,这也是每台机器都要配的。
这个脚本文件写的不咋地,所以在配置时一定注意在每一项的开始时要加空格,冒号后也必须要加空格,否则storm就不认识这个配置文件了,切记切记。
好的,那么我们来看一下这个配置文件是什么。
# vi conf/storm.yaml
我的配置内容是这样的:
nimbus.host: "cluster"
storm.local.dir: "/state/partition1/tmp/storm"
storm.zookeeper.servers:
- "cluster"
- "compute-0-0"
- "compute-0-1"
storm.zookeeper.port: 2181
说明一下:storm.local.dir表示storm需要用到的本地目录。nimbus.host表示那一台机器是master机器,即nimbus。storm.zookeeper.servers表示哪几台机器是zookeeper服务器。storm.zookeeper.port表示zookeeper的端口号,这里一定要与zookeeper配置的端口号一致,否则会出现通信错误,切记切记。当然你也可以配superevisor.slot.port,supervisor.slots.ports表示supervisor节点的槽数,就是最多能跑几个worker进程(每个sprout或bolt默认只启动一个worker,但是可以通过conf修改成多个)。
好的,到这里,我们的storm集群就配置好了。
接下来我们测试一下,依然用我们打包好的storm-start.jar。通过阅读源码我们可以知道,WordCountTopology在编写的时候如果在命令后不加参数,则是一个本地模式的WordCount,而如果有一个参数,也就是集群上的计算拓扑(Topology)名,它就会是一个在集群上跑的计算拓扑。
我们使用# bin/storm nimbus(主节点)和# bin/storm supervisor(从节点)启动storm。
storm还提供了一个可视化的工具,我们通过在主节点上输入命令# bin/storm ui来启动它,然后我们就可以在http://{NimbusHost}:8080进行查看。
那我们跑一下WordCount:
# storm jar StormStarter.jar storm.starter.WordCountTopology WordCount_1
出现错误Nimbus is not set。错误日志如下:
# ./storm jar /home/clx/storm-starter.jar storm.starter.WordCountTopology wordcount
Running: export STORM_JAR=/home/clx/storm-starter.jar; java -client -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -cp /home/clx/storm-0.5.4/storm-0.5.4.jar:/home/clx/storm-0.5.4/lib/log4j-1.2.16.jar:/home/clx/storm-0.5.4/lib/tools.macro-0.1.0.jar:/home/clx/storm-0.5.4/lib/jline-0.9.94.jar:/home/clx/storm-0.5.4/lib/commons-lang-2.5.jar:/home/clx/storm-0.5.4/lib/core.incubator-0.1.0.jar:/home/clx/storm-0.5.4/lib/junit-3.8.1.jar:/home/clx/storm-0.5.4/lib/compojure-0.6.4.jar:/home/clx/storm-0.5.4/lib/zookeeper-3.3.2.jar:/home/clx/storm-0.5.4/lib/clojure-contrib-1.2.0.jar:/home/clx/storm-0.5.4/lib/httpcore-4.0.1.jar:/home/clx/storm-0.5.4/lib/commons-logging-1.1.1.jar:/home/clx/storm-0.5.4/lib/commons-io-1.4.jar:/home/clx/storm-0.5.4/lib/ring-core-0.3.10.jar:/home/clx/storm-0.5.4/lib/httpclient-4.0.1.jar:/home/clx/storm-0.5.4/lib/commons-codec-1.3.jar:/home/clx/storm-0.5.4/lib/jzmq-2.1.0.jar:/home/clx/storm-0.5.4/lib/jvyaml-1.0.0.jar:/home/clx/storm-0.5.4/lib/commons-fileupload-1.2.1.jar:/home/clx/storm-0.5.4/lib/slf4j-log4j12-1.5.8.jar:/home/clx/storm-0.5.4/lib/servlet-api-2.5.jar:/home/clx/storm-0.5.4/lib/json-simple-1.1.jar:/home/clx/storm-0.5.4/lib/ring-jetty-adapter-0.3.11.jar:/home/clx/storm-0.5.4/lib/slf4j-api-1.5.8.jar:/home/clx/storm-0.5.4/lib/jetty-util-6.1.26.jar:/home/clx/storm-0.5.4/lib/joda-time-1.6.jar:/home/clx/storm-0.5.4/lib/libthrift7-0.7.0.jar:/home/clx/storm-0.5.4/lib/commons-exec-1.1.jar:/home/clx/storm-0.5.4/lib/clojure-1.2.0.jar:/home/clx/storm-0.5.4/lib/ring-servlet-0.3.11.jar:/home/clx/storm-0.5.4/lib/clj-time-0.3.0.jar:/home/clx/storm-0.5.4/lib/hiccup-0.3.6.jar:/home/clx/storm-0.5.4/lib/clout-0.4.1.jar:/home/clx/storm-0.5.4/lib/jetty-6.1.26.jar:/home/clx/storm-0.5.4/lib/servlet-api-2.5-20081211.jar:/home/clx/storm-starter.jar:/root/.storm:/home/clx/storm-0.5.4/bin storm.starter.WordCountTopology wordcount
0 [main] INFO backtype.storm.StormSubmitter - Jar not uploaded to master yet. Submitting jar...
Exception in thread "main" java.lang.IllegalArgumentException: Nimbus host is not set
at backtype.storm.utils.NimbusClient.<init>(NimbusClient.java:30)
at backtype.storm.utils.NimbusClient.getConfiguredClient(NimbusClient.java:17)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:78)
at backtype.storm.StormSubmitter.submitJar(StormSubmitter.java:71)
at backtype.storm.StormSubmitter.submitTopology(StormSubmitter.java:50)
at storm.starter.WordCountTopology.main(WordCountTopology.java:81)
解决方法是在~/.storm/目录新建storm.yaml文件,~代表用户主目录。storm.yaml文件内容:nimbus.host: "10.0.0.24"。重启nimbus后台程序,异常消失。
从此我们的WordCount_1就正常地跑起来了,并可以在ui中监视到了。证明Storm安装成功。
最后我想讲一下这几天装zookeeper的感触。首先是zookeeper端口号的配置一定要与storm中的一致,否则会出现通信异常,zookeeper无法正常启动。二是storm.yaml的配置比较脑残,一定要有空格的设计很不人性化,之前因为没有写空格导致不能识别,闹了很大的乌龙。最后是我自己的问题,以后真的不能再这么粗心了!把server写成sever导致zookeeper不能识别最后只能启动standalone模式,这个问题查了两天最后发现实在是自己太粗心了!当时真心想把手切掉!另外在集群上运行topology这个问题应该是storm脚本的问题,它没有把Nimbus的Host读出,而是需要人手动赋予,这个也是0.7.1这个版本的一个bug吧,希望以后发布的版本中有改进~
Twitter Storm 安装实战的更多相关文章
- Twitter Storm安装配置(Ubuntu系统)单机版
要使用storm首先要安装以下工具:JDK.Python.zookeeper.zeromq.jzmq.storm (注:各个模块都是独立的,如果安装失败或者卡顿可以单独百度某个模块的安装,都是可以的. ...
- Twitter Storm:单机环境的安装与配置
Twitter Storm:单机环境的安装与配置 好久没写博客了,这一段时间一直被导师push着做毕业设计.由于目前的方向偏向于图像识别检索,毕设打算做一个基于分布式计算平台的图像检索系统,查阅相关资 ...
- 在archlinux上搭建twitter storm cluster
本文详细描述如何在archlinux上搭建twitter storm cluster,转载请注明出处,谢谢. 有关archlinux基本系统安装,请参照archlinux简明安装指南一文,下面以上述为 ...
- [转载] 使用 Twitter Storm 处理实时的大数据
转载自http://www.ibm.com/developerworks/cn/opensource/os-twitterstorm/ 流式处理大数据简介 Storm 是一个开源的.大数据处理系统,与 ...
- 【原】storm源码之mac os x编译twitter storm源码
twitter storm是由backtype公司创始人nathanmarz一手研发和开源的流计算(实时计算)框架,堪称实时计算领域的hadoop.nathanmarz也是在mac os x环境下开发 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
- Apache Storm技术实战之1 -- WordCountTopology
欢迎转载,转载请注意出处,徽沪一郎. “源码走读系列”从代码层面分析了storm的具体实现,接下来通过具体的实例来说明storm的使用.因为目前storm已经正式迁移到Apache,文章系列也由twi ...
- twitter storm源码走读之2 -- tuple消息发送场景分析
欢迎转载,转载请注明出处源自徽沪一郎.本文尝试分析tuple发送时的具体细节,本博的另一篇文章<bolt消息传递路径之源码解读>主要从消息接收方面来阐述问题,两篇文章互为补充. worke ...
- twitter storm源码走读之1 -- nimbus启动场景分析
欢迎转载,转载时请注明作者徽沪一郎及出处,谢谢. 本文详细介绍了twitter storm中的nimbus节点的启动场景,分析nimbus是如何一步步实现定义于storm.thrift中的servic ...
随机推荐
- Python基础入门-IF语句
今天给大家分享一下Python中的IF语句的使用场景以及注意事项.主要内容如下: 1.python中的真假 2.Python操作符 3.if语句实例和嵌套实例 4.if语句中的if嵌套实例 5.and ...
- 解决chrome浏览器无法得到window.showModalDialog返回值的问题
父页面处理: function ProductList() { var TypeID = window.document.getElementById("Type").valu ...
- 牌型总数——第六届蓝桥杯C语言B组(省赛)第七题
原创 牌型种数 小明被劫持到X赌城,被迫与其他3人玩牌.一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得 ...
- Math对象的使用
1. Math.floor() === 向下取整 2.Math.random() === 取一个浮点随机数 3.Math.round() === 四舍五入后一个最接近的整数 4.Math.ceil() ...
- SQLServer备份恢复助手(太强大了!)
下载地址: http://download.csdn.net/detail/gguozhenqian/8105779
- SpringMVC+Hibernate 项目开发之三 (创建SpringMVC项目)
引用(很全面了):http://blog.csdn.net/dhx20022889/article/details/38041039 我只想说默认创建的项目使用的Spring版本可能不是你想要的,可以 ...
- 使用 wget 下载需要 cookie 认证的网站
.使用火狐,安装 Export Cookies 插件 2.登录网站,点菜单"工具-Export Cookies..",保存 cookies.txt 到自己的文件夹 3.把 cookies.t ...
- javascript 文件的操作
js 文件的操作(ActiveXObject仅支持IE) 一.参数解释: 1. filename: filename //文件路径 2.iomode: var forReading=1;只读var f ...
- ecliplse里tomcat正常启动后http://localhost:8080/报错404
如下图所示,新建一个工作区间,添加tomcat之后通过ecliplse启动tomcat之后: 访问http://localhost:8080/出现404: 解决方法: 1.确保tomcat里面所有项目 ...
- 解决Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker fro问题
项目中碰到一个问题,就是将一个map转换成json格式的时候出现错误,最后排查将延迟加载关闭后成功转换,因为数据量较大,于是重新创建了一个对象进行接收. 解决办法是在配置文件中进行配置 虽然解决了这个 ...