分享

Windows下基于eclipse的Storm应用开发与调试

sstutu 发表于 2014-9-28 15:58:41 [显示全部楼层] 只看大图 回帖奖励 阅读模式 关闭右栏 12 96864

问题导读
1.编写Topology,由哪三步分组成?
2.创建maven工程的作用是什么?
3.如何编写编写Spout、bolt、topo?





本文以一个简单的example来讲解如何开发storm应用程序
1、创建maven工程
  在eclipse下创建maven工程
   下载1.png

2、修改pom.xm添加依赖包
  使用maven-assembly-plugin插件将工程依赖的jar都一起打包
  storm的<scope>设置provided,主要是因为只要编译时需要storm包,当在storm集群运行时就不要将它一起打包了。
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.   <modelVersion>4.0.0</modelVersion>
  4.   <groupId>com.test</groupId>
  5.   <artifactId>storm-example</artifactId>
  6.   <version>0.0.1-SNAPSHOT</version>
  7.   <packaging>jar</packaging>
  8.   <name>storm-example</name>
  9.   <url>http://maven.apache.org</url>
  10.   <properties>
  11.     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12.   </properties>
  13.   <dependencies>  
  14.       <dependency>
  15.            <groupId>org.apache.storm</groupId>
  16.          <artifactId>storm-core</artifactId>
  17.          <version>0.9.2-incubating</version>
  18.          <scope>provided</scope>
  19.        </dependency>
  20.   </dependencies>
  21.   
  22.   <build>
  23.     <plugins>
  24.       <plugin>
  25.         <artifactId>maven-assembly-plugin</artifactId>
  26.         <version>2.4</version>
  27.         <configuration>
  28.           <descriptorRefs>
  29.             <descriptorRef>jar-with-dependencies</descriptorRef>
  30.           </descriptorRefs>
  31.         </configuration>
  32.         <executions>
  33.           <execution>
  34.             <id>make-assembly</id>
  35.             <phase>package</phase>
  36.             <goals>
  37.               <goal>single</goal>
  38.             </goals>
  39.           </execution>
  40.         </executions>
  41.       </plugin>
  42.     </plugins>
  43.   </build>
  44. </project>
复制代码

3、编写Topology
  (1) 编写Spout
  1. import backtype.storm.spout.SpoutOutputCollector;
  2. import backtype.storm.task.TopologyContext;
  3. import backtype.storm.topology.OutputFieldsDeclarer;
  4. import backtype.storm.topology.base.BaseRichSpout;
  5. import backtype.storm.tuple.Fields;
  6. import backtype.storm.tuple.Values;
  7. public class RandomSpout extends BaseRichSpout{
  8.     private SpoutOutputCollector collector;
  9.     private static String[] words = {"happy","excited","angry"};
  10.    
  11.     /* (non-Javadoc)
  12.      * @see backtype.storm.spout.ISpout#open(java.util.Map, backtype.storm.task.TopologyContext, backtype.storm.spout.SpoutOutputCollector)
  13.      */
  14.     public void open(Map arg0, TopologyContext arg1, SpoutOutputCollector arg2) {
  15.         // TODO Auto-generated method stub
  16.         this.collector = arg2;
  17.     }
  18.    
  19.     /* (non-Javadoc)
  20.      * @see backtype.storm.spout.ISpout#nextTuple()
  21.      */
  22.     public void nextTuple() {
  23.         // TODO Auto-generated method stub
  24.         String word = words[new Random().nextInt(words.length)];
  25.         collector.emit(new Values(word));
  26.     }
  27.    
  28.     /* (non-Javadoc)
  29.      * @see backtype.storm.topology.IComponent#declareOutputFields(backtype.storm.topology.OutputFieldsDeclarer)
  30.      */
  31.     public void declareOutputFields(OutputFieldsDeclarer arg0) {
  32.         // TODO Auto-generated method stub
  33.         arg0.declare(new Fields("randomstring"));
  34.     }
  35. }
复制代码

 (2)编写bolt
  1. import backtype.storm.topology.BasicOutputCollector;
  2. import backtype.storm.topology.OutputFieldsDeclarer;
  3. import backtype.storm.topology.base.BaseBasicBolt;
  4. import backtype.storm.tuple.Tuple;
  5. public class SenqueceBolt extends BaseBasicBolt{
  6.     /* (non-Javadoc)
  7.      * @see backtype.storm.topology.IBasicBolt#execute(backtype.storm.tuple.Tuple, backtype.storm.topology.BasicOutputCollector)
  8.      */
  9.     public void execute(Tuple input, BasicOutputCollector collector) {
  10.         // TODO Auto-generated method stub
  11.          String word = (String) input.getValue(0);  
  12.          String out = "I'm " + word +  "!";  
  13.          System.out.println("out=" + out);
  14.     }
  15.    
  16.     /* (non-Javadoc)
  17.      * @see backtype.storm.topology.IComponent#declareOutputFields(backtype.storm.topology.OutputFieldsDeclarer)
  18.      */
  19.     public void declareOutputFields(OutputFieldsDeclarer declarer) {
  20.         // TODO Auto-generated method stub
  21.     }
  22. }
复制代码

(3)编写topo
   提供cluster和Local两种运行模式,这样我们就很方便的在本地运行FirstTopo来调试我们程序了。
  1. import backtype.storm.Config;
  2. import backtype.storm.LocalCluster;
  3. import backtype.storm.StormSubmitter;
  4. import backtype.storm.topology.TopologyBuilder;
  5. import backtype.storm.utils.Utils;
  6. public class FirstTopo {
  7.    
  8.     public static void main(String[] args) throws Exception {  
  9.         TopologyBuilder builder = new TopologyBuilder();   
  10.         builder.setSpout("spout", new RandomSpout());  
  11.         builder.setBolt("bolt", new SenqueceBolt()).shuffleGrouping("spout");
  12.         Config conf = new Config();  
  13.         conf.setDebug(false);
  14.         if (args != null && args.length > 0) {  
  15.             conf.setNumWorkers(3);  
  16.             StormSubmitter.submitTopology(args[0], conf, builder.createTopology());  
  17.         } else {  
  18.   
  19.             LocalCluster cluster = new LocalCluster();  
  20.             cluster.submitTopology("firstTopo", conf, builder.createTopology());  
  21.             Utils.sleep(100000);  
  22.             cluster.killTopology("firstTopo");  
  23.             cluster.shutdown();  
  24.         }  
  25.     }  
  26. }
复制代码

(4)运行结果
    本地运行时,在eclipse中的输出:
     下载2.png

   在storm集群中运行时输出可以通过Storm UI进行查看
     下载3.png









原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3971113.html
欢迎加入about云群425860289432264021 ,云计算爱好者群,关注about云腾讯认证空间

已有(12)人评论

跳转到指定楼层
梦回三国 发表于 2014-9-29 16:58:09
其实我想问的是,这个storm集群或者单机如果是在linux中配置,在Windows中的eclipse上开发的话。

main方法里面总要配置一点什么吧,比如集群nimbus的IP地址等,不然一个windows上的程序怎么会知道storm集群的位置呢。难道windows中也需要安装配置storm吗,具体怎么配置呢?
回复

使用道具 举报

howtodown 发表于 2014-9-29 20:02:49
梦回三国 发表于 2014-9-29 16:58
其实我想问的是,这个storm集群或者单机如果是在linux中配置,在Windows中的eclipse上开发的话。

main方 ...
https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml。

~/.storm/storm.yaml
修改storm.yaml的默认配置。改一下:
1  #storm.local.dir: "/mnt/storm",改成适合自己平台的地址。这文件夹存储storm的本地文件。
2  #storm.cluster.mode: "distributed" ,采取的远程模式,而不是本地模式。
3  #nimbus.host:”10.141.9.227”,nimbus的地址。

回复

使用道具 举报

梦回三国 发表于 2014-9-29 20:56:42
howtodown 发表于 2014-9-29 20:02
https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml。

~/.storm/storm.yaml

谢谢,我试一下
回复

使用道具 举报

梦回三国 发表于 2014-9-29 22:16:05
howtodown 发表于 2014-9-29 20:02
https://github.com/nathanmarz/storm/blob/master/conf/defaults.yaml。

~/.storm/storm.yaml

#storm.cluster.mode: "distributed" 是本地平台的storm改呢,还是linux集群中的改呢,还是都要修改?
回复

使用道具 举报

sstutu 发表于 2014-9-30 17:37:13
梦回三国 发表于 2014-9-29 22:16
#storm.cluster.mode: "distributed" 是本地平台的storm改呢,还是linux集群中的改呢,还是都要修改?
这个只是针对的,开发。一般只需要该


nimbus.host:”10.141.9.227”,
nimbus的地址。
其它的可以先不用改。
回复

使用道具 举报

qzjqzjqzj 发表于 2015-3-28 18:30:14
楼主
请教个本地模式问题
如果创建java工程后(不是maven工程),直接用eclipse run as java application的话,报错,报java.lang.RuntimeException: Error when launching multilang subprocess
和Caused by: java.io.IOException: Cannot run program "python" (in directory "C:\Users\QZJ\AppData\Local\Temp\3c2a52cd-2e02-491f-b4a7-240bd4ac7e17\supervisor\stormdist\word-count-1-1427536552\resources"): CreateProcess error=2, ?????????
是什么原因?
如果不通过run as 运行,而是把工程导出成jar包,然后在windows cmd控制台运行
storm jar starter.jar storm.starter.WordCountTopology则能正常运行,控制台输出调试信息,这是什么原因?
如果创建的是maven工程,则通过run as 直接在eclipse运行没问题(好像是这样,不是记得特别清楚了,之前我试过几次)
回复

使用道具 举报

qzjqzjqzj 发表于 2015-3-28 18:33:48
创建java project按照这个地址创建
http://www.cnblogs.com/XjChenny/p/3214039.html
没有创建meven工程,而是创建的java project只是创建完以后,只能通过 windows cmd storm命令提交jar,如果在wordCountTopology类里点击右键运行run as java application的话,本地模式运行,则报错;
报错的原因跟有没有装python没关系,跟resources也没有关系,我装不装python都能通过storm提交
回复

使用道具 举报

hyj 发表于 2015-3-29 01:52:08
qzjqzjqzj 发表于 2015-3-28 18:33
创建java project按照这个地址创建
http://www.cnblogs.com/XjChenny/p/3214039.html
没有创建meven工程 ...


参考这个:
storm本地模式是不是本地程序直接可以跑起来?
回复

使用道具 举报

ainubis 发表于 2015-3-29 16:20:21
谢谢楼主分享。   
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条