前面说过了Storm的测试项目,那么此时我们更想自己写一个小项目来练练手,首先我们自己的Windows系统上首先应该安装好maven,然后启动Eclipse for JavaEE版本,接下来开始建立项目并开发

  注意,在开发过程中,无论是Windows还是Linux都要完全关闭防火墙,避免网络的问题

  单击"File"->"New"->"Maven Project"

  

  接下来的界面默认即可,单击Next

  

  下一步,继续单击Next即可

  

  然后,在Group Id输入:org.apache.storm 在Artifact Id输入:firststorm 这里可以自己定义,在Version中输入版本号:0.9.6,这里其实默认0.1.0没有问题,这个和storm的版本号没有任何关系,这里是我们项目的版本号,因为只是测试,输入0.9.6是为了更简单;Package包名会自动根据输入生成,我们默认即可,然后单击Finish,稍等右下角滚动条滚动完毕,一个基本的Maven项目就建立成功了,具体结构和上一个测试案例相同,这时在包org.apache.storm.firststorm下有一个默认的类App.java,由Maven自动生成,这个可以忽略,也可以删除

  

  然后打开项目根目录下的pom.xml文件,这个就是构建项目的配置文件,我们在dependencies标签之间,添加一个节点,代码如下:

<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.6</version>
<scope>provided</scope>
</dependency>

  加入位置如下图所示,其他的不用动即可

  

  最终pom.xml的代码如下:

 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.apache.storm</groupId>
<artifactId>firststorm</artifactId>
<version>0.9.6</version>
<packaging>jar</packaging> <name>firststorm</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

  更简单的方法我们可以直接复制上一个案例中的pom.xml文件直接使用,现在我们保存pom.xml文件,保存的时候maven会自动下载相关依赖并放到Maven Dependencies下,这些jar包可以点击下拉查看,并且会自动添加到项目classpath中,作为编译使用,等jar包全部下载完毕,现在开始编写具体的计算逻辑了,在这个项目中我们把所有的类都建立在包org.apache.storm.firststorm下

  首先建立RandomSpout类作为数据源,并且继承于父类BaseRichSpout,确定后可以看到系统自动补全3个方法:nextTuple,open和declareOutputFields

  

  我们现在就需要重写这3个方法,open方法是数据源的初始化,nextTuple的作用是把Tuple发送至下游,declareOutputFields用来定义输出字段,下面我们手动分配一个数组,并且随机取里面的元素,代码如下:

 package org.apache.storm.firststorm;

 import java.util.Map;
import java.util.Random; import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values; public class RandomSpout extends BaseRichSpout { private SpoutOutputCollector collector;
private static String[] words = {"Hadoop","Storm","Apache","Linux","Nginx","Tomcat","Spark"}; public void nextTuple() {
String word = words[new Random().nextInt(words.length)];
collector.emit(new Values(word)); } public void open(Map arg0, TopologyContext arg1, SpoutOutputCollector arg2) {
this.collector = arg2;
} public void declareOutputFields(OutputFieldsDeclarer arg0) {
arg0.declare(new Fields("randomstring"));
} }

  代码很简单,肯定可以看懂,然后新建一个类SenqueceBolt,继承于BaseBasicBolt类,并且重写方法execute和declareOutputFields,这个类就是用于执行具体的作业,准确的说是execute方法用来执行相关的计算,这里只是简单的输出,代码如下:

 package org.apache.storm.firststorm;

 import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple; public class SenqueceBolt extends BaseBasicBolt { public void execute(Tuple arg0, BasicOutputCollector arg1) {
String word = (String) arg0.getValue(0);
String out = "Hello " + word + "!";
System.out.println(out);
} public void declareOutputFields(OutputFieldsDeclarer arg0) { } }

  最后建立一个类FirstStorm,这个类是主类,在main方法中定义Topology,并且综合设置Spout和Bolt,从而调用其中的方法,这里流式计算时间设置为30s,代码如下:

 package org.apache.storm.firststorm;

 import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.utils.Utils; public class FirstStorm { public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSpout());
builder.setBolt("bolt", new SenqueceBolt()).shuffleGrouping("spout");
Config conf = new Config();
conf.setDebug(false);
if(args != null && args.length > 0) {
conf.setNumWorkers(3);
try {
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} catch (AlreadyAliveException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidTopologyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("firststorm", conf, builder.createTopology());
Utils.sleep(30000);
cluster.killTopology("firststorm");
cluster.shutdown();
}
} }

  到这里一个简单的storm项目就开发完毕了,然后可以用本地模式运行,跑起来之后某一时刻输出结果如下:

  

  接下来我们将这个项目放到Storm服务器集群中运行,这里不要把Storm的jar包加进来,因为运行的时候,Storm环境会自动加载并协调集群运行,方法有很多,可以使用插件上传,也可以使用本地Storm客户端配置一下numbus.host进行提交,也可以在服务器节点上执行,执行后nimbus会得到任务并分发给各个supervisor去执行,首先我们应该将项目打包,右击项目,选择Export

  

  然后导出类型选择Java下的JAR file,点击Next

  

  然后单击Brower确定输出位置和文件名或者直接在输入框输入jar包的名称,然后单击Finish完成打包

  

  打包之后我们可以在输出位置看见一个jar文件

  

  然后我们将这个文件上传到服务器,这里上传到了storm安装目录下,然后这个时候在主节点storm安装目录下执行: bin/storm nimbus & 在从节点目录下分别执行 bin/storm supervisor & 启动整个集群的storm服务,也可以执行 bin/storm ui & 启动UI管理界面更直观的看到执行结果,当然对于单机环境启动或者不启动storm服务都可以,这个时候,执行下面命令运行本次项目的程序:

bin/storm jar firststorm.jar org.apache.storm.firststorm.FirstStorm

  这里就是调用了FirstStorm类中的main方法,如果程序中对参数进行了处理,后面还可以跟上参数,回车确认执行之后,系统会进行初始化集群的工作,几秒后任务开始执行,执行过程中某一时刻的滚动输出如下:

  

  到这里,第一个Storm入门项目的开发和测试运行都完毕了,更复杂的计算逻辑模式也基本相同,主要就是Maven项目中出现了更复杂的模块和调用,整个运行的流程其实都是差不多的,现在就算步入Storm流式计算的殿堂的大门了,接下来的精彩还需要慢慢体会

基于Maven构建开发第一个Storm项目的更多相关文章

  1. 基于Maven构建的Spring+Mybatis项目

    项目的目录结构: 1.基于Maven构建Web项目 参考:基于Maven构建Web项目 2.导入项目依赖 Spring 核心容器(Beans.Core.Context.Context support. ...

  2. IntelliJ IDEA基于maven构建的web项目找不到jar包

    基于maven构建的springMVC项目,下载好jar包import后,运行提示ClassNotFoundException: java.lang.ClassNotFoundException: o ...

  3. 基于Maven构建整合SpringMVC+Mybtis+Druid

    前几天趁空闲时间整合了下SpringMVC+Mybatis+Druid,这里小记录下,这个Demo是基于Maven构建的,数据源用的是阿里巴巴温少的开源项目Druid,数据库用的是Mysql. 由于E ...

  4. Spring 3整合Quartz 1实现定时任务一:常规整合(基于maven构建)

    Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类 ...

  5. 第三章 Maven构建 Java Spring Boot Web项目

    3.1   认识Srping Boot Spring Boot是一个框架,是一种全新的编程规范,它的产生简化了对框架的使用,简化了Spring众多的框架中大量的繁琐的配置文件,所以说Spring Bo ...

  6. Maven构建简单的多模块项目

    复制于http://www.cnblogs.com/luxh/p/3506750.html 做个记录 一般web项目会进行分模块开发.这里简单分为domain(领域层).persist(持久层).se ...

  7. 基于maven使用IDEA创建多模块项目

    原文地址:http://blog.csdn.net/williamhappy/article/details/54376855 鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDE ...

  8. 使用Maven+ssm框架搭建一个web项目

    1,前期准备:Eclipse(Mars.2 Release (4.5.2)).jdk1.7.tomcat7.maven3.2.1 2.使用eclipse中的maven新建一个web项目 点击next: ...

  9. 用STS和Maven的方式创建一个JavaWeb项目

    一.创建项目 1.Eclipse中用Maven创建项目,选maven-archetype-webapp,如下图: 创建好项目后,目录如下: 至此,项目已经创建完毕,下边是配置.关键所在!!! 二.项目 ...

随机推荐

  1. php二维数组排序的处理

    一维数组排序可以使用asort.ksort等一些方法进程排序,相对来说比较简单.二维数组的排序怎么实现呢?使用array_multisort和usort可以实现 例如像下面的数组:    代码如下: ...

  2. CentOS7挂载分区教程

    http://www.centoscn.com/CentOS/config/2014/1016/3955.html

  3. GCD 常用代码

    GCD 常用代码 体验代码 异步执行任务 - (void)gcdDemo1 { // 1. 全局队列 dispatch_queue_t q = dispatch_get_global_queue(0, ...

  4. angularjs DOM操作之jqLite篇

    angular.element(el).find("input").attr({value:1}); * ## Angular's jqLite * jqLite provides ...

  5. AngularJS常用指令用法详解

    ng-class 1>ng-init   ng-bind 11111 2>ng-class 111 3>ng-repeat 3.1-数据绑定     ng-repeat可以绑定数组和 ...

  6. thinkphp的url地址区分大小写?

    在默认情况下: 在访问url地址的时候, 其中的 Action类名 即: 模块名称 是区分大小写的. (只有模块名, 即控制器名称) 可以根据设置 'URL_CASE_INSENSITIVE' =&g ...

  7. 时间处理工具类DateUtils

    public class DateUtils {         public static final String                            SHORT_DATE    ...

  8. EF-error 0152: No Entity Framework provider found...

    突然就报这个错了... ... 哈哈··· 原来是 "EntityFramework.SqlServer.dll" 没有引用··· 添加引用就好了... ... 还好不了?那就不知 ...

  9. iOS 滑动性能优化

    iOS 滑动性能优化 目录 一. 减少图层的Blend操作 1. UIView的背景色避免使用clearColor 2. 控件贴图避免使用带alpha的图片 3. UIImageView 使用时避免半 ...

  10. 微信电话本可免费拨打网络电话 通话一分钟约300K流量

    微信电话本新版本于昨日晚间发布,这是一款智能通讯增强软件,通话双方都下载此APP并开通免费通话功能就能使用微信电话本拨打免费网络电话,在对方无法接通情况下还能将音频转向语音信箱,微信电话本目前支持An ...