前面说过了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. Hello World(本博客启程篇)

    Hello World 作为本博客第一篇日志,作为程序员,无论走到哪里,做什么事,必须先输出这句话. 一个想法 从今天3月份到现在一直在学技术,过程中坑的解决.知识的总结以及想法等都写到了" ...

  2. BootStrap学习------栅格

    使用Bootstrap前端框架-栅格 要点 1.使用Bootstrap需要引入的css和js: (1)bootstrap.min.js (2)bootstrap.min.css 2.栅格系统需要通过& ...

  3. java批量生成excel代码分享

    package com.test.util; /** * @author ocq * */ import java.io.FileOutputStream; import java.io.IOExce ...

  4. 常用的MIME类型

    .doc     application/msword .docx   application/vnd.openxmlformats-officedocument.wordprocessingml.d ...

  5. NSURLSession & NSCache

    用于替代 NSURLConnection 支持后台运行的网络任务 暂停.停止.重启网络任务,不再需要 NSOperation 封装 请求可以使用同样的配置容器 不同的 session 可以使用不同的私 ...

  6. codeforces CF475 ABC 题解

    Bayan 2015 Contest Warm Up http://codeforces.com/contest/475 A - Bayan Bus B - Strongly Connected Ci ...

  7. Sublime Text3

    Sublime Text3 激活码: ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E- 813A03DD 5E4AD9E ...

  8. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  9. 阿里云Centos配置iptables防火墙

    虽说阿里云推出了云盾服务,但是自己再加一层防火墙总归是更安全些,下面是我在阿里云vps上配置防火墙的过程,目前只配置INPUT.OUTPUT和FORWORD都是ACCEPT的规则 一.检查iptabl ...

  10. godaddy空间的sql server数据库没办法insert中文

    原来的代码: use string007 from sysobjects where id = object_id('K_V_TEST') and type = 'U') drop table K_V ...