storm学习(一):搭建storm单机调试环境

最近工作需要,学习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


org.twitter4j
twitter4j-core
[2.2,)


org.twitter4j
twitter4j-stream
[2.2,)

第二,是在运行的时候报错,错误提示某段python代码出错。 这个和我的本机环境有关,我本机安装了Python2.7 python3.3两个版本而这个代码报错的原因是使用了python3来执行python脚本。 我用ln -s修改了 python的默认链接指向python2.7再运行可以顺利执行。(这个例子里面为什么使用了python。由于刚刚接触还没有读代码也不太清楚)。

运行的截图如下:

storm学习(一):搭建storm单机调试环境_第1张图片


最后再说一下本地安装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)

原因是服务器用的storm版本与客户端使用的storm版本不一致,统一storm版本后问题解决

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 执行正常问题解决


你可能感兴趣的:(JAVA,storm)