最近工作需要,学习storm的使用。
这里做一下单机环境的搭建备忘:
storm官网地址:http://storm-project.net/
文档地址:http://storm-project.net/documentation.html
官方文档说明:
storm有两种操作模式:本地单机模式和远程模式。 本地模式可以用来开发以及测试topologies使用,本地模式模拟集群环境在本地的一个进程中。远程模式是将自己的topologies程序打包后提交到远程的集群环境中运行。
下面说一下本地单机模式环境的搭建:
单机模式主要是在代码中加入:
import backtype.storm.LocalCluster; LocalCluster cluster = new LocalCluster();用LocalCluster来模拟集群环境,所以单机环境 的开发环境其实只需要讲storm的jar包放在classpath就可以了。
这里建议使用maven来管理依赖的jar包,pom.xml的例子,可以点击这里。
官方给出了一个storm-starter 例子。大家下载之后可以把项目导入到eclipse里导入之前把项目中的m2-pom.xml改成pom.xml,这样就可以被eclipse导入。
如果在eclipse里只要可以运行storm.starter.WordCountTopology 可以看到程序运行的效果。也可以使用maven来运行项目,执行如下命令:
$ mvn -f m2-pom.xml compile exec:java -Dexec.classpathScope=compile -Dexec.mainClass=storm.starter.WordCountTopology
这里我在实际操作过程中遇到两个问题说明一下,
第一,storm-starter依赖的jar包找不到。 报 twitter4j-stream,twitter4j-core 这两个jar找不到,原因是资源库被墙获取不到,一个可以使用代理。另外可以修改版本设置有些版本的jar可以获取也不影响使用。修改pom.xml
第二,是在运行的时候报错,错误提示某段python代码出错。 这个和我的本机环境有关,我本机安装了Python2.7 python3.3两个版本而这个代码报错的原因是使用了python3来执行python脚本。 我用ln -s修改了 python的默认链接指向python2.7再运行可以顺利执行。(这个例子里面为什么使用了python。由于刚刚接触还没有读代码也不太清楚)。
运行的截图如下:
最后再说一下本地安装storm。这个也算作开发环境一部分。使用场景是在本地上传jar包到集群环境下运行。
首先下载最新版本storm。解压到本地任何目录,解压后将storm目录里面bin 目录设置在环境变量path中。保证storm下bin/storm是可以运行的。
之后就可以使用storm命令进行jar包发布。不过需要修改storm的客户端配置。
在storm目录下conf/storm.yaml文件,设置nimbus.host: 为storm集群中nimbus所在的服务器ip地址 冒号后面注意要有空格。
这里在实际操作的过程中遇到几个问题:
1.storm修改配置之后没有生效,原因是storm脚本的问题。
CONF_DIR = os.path.expanduser("~/.storm") 这个说明storm配置文件设置在用户目录下的.storm文件夹中。
解决办法一个是把配置文件放在~/.storm目录中。另外一个方法是修改这段代码路径到配置文件所在的目录。之后保存推出问题解决。
2.执行storm list的时候报错
Exception in thread "main" java.lang.RuntimeException: org.apache.thrift7.protocol.TProtocolException: Required field 'supervisor_id' is unset! Struct:SupervisorSummary(host:hslave1, uptime_secs:531, num_workers:8, num_used_workers:0, supervisor_id:null)
at storm.starter.ReachTopology.main(ReachTopology.java:194)
Caused by: org.apache.thrift7.protocol.TProtocolException: Required field 'supervisor_id' is unset! Struct:SupervisorSummary(host:hslave1, uptime_secs:531, num_workers:8, num_used_workers:0, supervisor_id:null)
at backtype.storm.generated.SupervisorSummary.validate(SupervisorSummary.java:682)
at backtype.storm.generated.SupervisorSummary.read(SupervisorSummary.java:597)
at backtype.storm.generated.ClusterSummary.read(ClusterSummary.java:456)
at backtype.storm.generated.Nimbus$getClusterInfo_result.read(Nimbus.java:10648)
at org.apache.thrift7.TServiceClient.receiveBase(TServiceClient.java:78)
at backtype.storm.generated.Nimbus$Client.recv_getClusterInfo(Nimbus.java:451)
at backtype.storm.generated.Nimbus$Client.getClusterInfo(Nimbus.java:439)
at storm.starter.ReachTopology.main(ReachTopology.java:184)
3.用storm jar执行storm-starter项目时发现还是在本地执行
执行的命令如下:
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology
结果执行显示在本地执行
因为配置文件已经修改,排除配置文件的问题。
最后查看WordCountTopology的代码发现
if (args != null && args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
}
else {
conf.setMaxTaskParallelism(3);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("word-count", conf, builder.createTopology());
Thread.sleep(10000);
cluster.shutdown();
}
执行命令:
storm jar storm-starter-0.0.1-SNAPSHOT-jar-with-dependencies.jar storm.starter.WordCountTopology wordCountTopology 执行正常问题解决