配置好storm之后就可以开始在eclipse里面写topology了。

下面是我在网上搜到的一个简单的例子,我按照自己的理解注释了一下。

第一步,创建mvn工程

这是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>cn.aeths.storm</groupId>
<artifactId>storm001</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>storm001</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.2-incubating</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

使用的是storm-core-0.9.2-incubating.jar

我没找到这个jar包的源码导致没看到LocalCliuster的源码,也可能是添加的方式有问题

第二步,创建spout输入tuple

这是RandomSpout.java类的代码

 package cn.aeths.storm.storm001.spout;

 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; //简单的输入spout
@SuppressWarnings("serial")
public class RandomSpout extends BaseRichSpout {
//继承了一个方法少的抽象类
//私有属性,一个收集器,收集来自spout的tuple,这个和OutputCollector的区别是可以打id保证都执行一次
private SpoutOutputCollector collector;
//这是个字符串数组,虚拟的输入源
private static String[] words = { "happy", "excited", "angry" }; //可以当做是worker的初始化的方法,传递的参数分别是配置信息,获取id的参数,处理流的参数。
public void open(Map arg0, TopologyContext arg1, SpoutOutputCollector arg2) {
this.collector = arg2;
} //调用这个方法就是在要求spout传递流交给收集器
public void nextTuple() {
//随机的给word赋值
String word = words[new Random().nextInt(words.length)];
//将流发射到输出,不带id的发射,所以不跟踪,没有ack和fail的调用
collector.emit(new Values(word));
} public void declareOutputFields(OutputFieldsDeclarer arg0) {
//声明分发的方式
arg0.declare(new Fields("randomstring"));
} }

第三步,创建bolt处理tuple

这是SequenceBolt.java类的代码

 package cn.aeths.storm.storm001.bolt;

 import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Tuple;
//这个是简单的bolt类
@SuppressWarnings("serial")
public class SenqueceBolt extends BaseBasicBolt{
//继承了一个BaseBasicBolt
//这是简单的方式,因为它也是别的类实现的BaseBasicBolt extends BaseComponent implements IBasicBolt
//public interface IBasicBolt extends IComponent
//总之继承基础的抽象类,实现了其中的两个方法 public void execute(Tuple input, BasicOutputCollector collector) {
//处理输入tuple或者在输入的tuple的基础上emit tuple
//在本例中就是获取输入,将它包装一下,打印在命令行
String word = (String) input.getValue(0);
String out = "I'm " + word + "!";
System.out.println("out=" + out);
} public void declareOutputFields(OutputFieldsDeclarer declarer) {
//声明拓扑的流的输出约束,这里没用到
} }

第四步,创建topology

这是FirstTopo.java类的代码

 package cn.aeths.storm.storm001.topology;

 import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.utils.Utils;
import cn.aeths.storm.storm001.bolt.SenqueceBolt;
import cn.aeths.storm.storm001.spout.RandomSpout;
//拓扑创建的额类
public class FirstTopo { public static void main(String[] args) throws Exception {
//声明拓扑创建的api
TopologyBuilder builder = new TopologyBuilder();
//设置输入spout,第一个参数是id可以用这个被bolt调用,第二个参数是实例化的spout
builder.setSpout("spout", new RandomSpout());
//设置一个新的bolt处理流,第一个参数是id可以被其他的消费它的bolt使用,第二个参数是实例化的bolt
builder.setBolt("bolt", new SenqueceBolt()).shuffleGrouping("spout");
Config conf = new Config(); //方便的为拓扑创建配置,是继承map的,使用setter方法
conf.setDebug(false);//关闭调试模式
if (args != null && args.length > 0) {
//有参数的时候,集群模式
conf.setNumWorkers(3);
//把本类,本配置,本拓扑提交
StormSubmitter.submitTopology(args[0], conf, builder.createTopology());
} else {
//本地模式
LocalCluster cluster = new LocalCluster();
//提交拓扑,名字自定义
cluster.submitTopology("firstTopo", conf, builder.createTopology());
//休眠10s
Utils.sleep(10000);
//杀死拓扑
cluster.killTopology("firstTopo");
cluster.shutdown();
}
}
}

第五步,提交storm运行

命令行的结果如下:

 out=I'm happy!
out=I'm excited!
out=I'm happy!
out=I'm happy!
out=I'm excited!
out=I'm angry!
out=I'm angry!
out=I'm happy!
52008 [Thread-8-bolt] INFO backtype.storm.util - Async loop interrupted!
52009 [main] INFO backtype.storm.daemon.executor - Shut down executor bolt:[2 2
]
52009 [main] INFO backtype.storm.daemon.executor - Shutting down executor spout
:[3 3]
52010 [Thread-10-spout] INFO backtype.storm.util - Async loop interrupted!

http://blog.csdn.net/annkie/article/details/6960934
这个文献教会我怎么给eclipse添加jre的源码

这是第一个本地虚拟的集群运行的topology,下面学习一下相对复杂的一个例子。

STORM_0005_第一个非常简单的storm topology的提交运行的更多相关文章

  1. Storm Topology Parallelism

    Understanding the Parallelism of a Storm Topology What makes a running topology: worker processes, e ...

  2. Storm系列之一——Storm Topology并发

    1.是什么构成一个可运行的topology? worker processes(worker进程),executors(线程)和tasks. 一台Storm集群里面的机器可能运行一个或多个worker ...

  3. 简单聊聊Storm的流分组策略

    简单聊聊Storm的流分组策略 首先我要强调的是,Storm的分组策略对结果有着直接的影响,不同的分组的结果一定是不一样的.其次,不同的分组策略对资源的利用也是有着非常大的不同,本文主要讲一讲loca ...

  4. java.lang.ClassNotFoundException: org.apache.storm.topology.IRichSpout

    java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout at java.lang.Class.getDeclaredM ...

  5. Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichSpout

    1:初次运行Strom程序出现如下所示的错误,贴一下,方便脑补,也希望帮助到看到的小伙伴: 错误如下所示,主要问题是刚开始使用maven获取jar包的时候需要写<scope>provide ...

  6. Storm Topology 提交 总结---Kettle On Storm 实现

    一,目的 在学习的过程中,需要用到 PDI---一个开源的ETL软件.主要是用它来设计一些转换流程来处理数据.但是,在PDI中设计好的 transformation 是在本地的执行引擎中执行的,(参考 ...

  7. [转]ZooKeeper学习第一期---Zookeeper简单介绍

    ZooKeeper学习第一期---Zookeeper简单介绍 http://www.cnblogs.com/sunddenly/p/4033574.html 一.分布式协调技术 在给大家介绍ZooKe ...

  8. 程序设计入门-C语言基础知识-翁恺-第一周:简单的计算程序-详细笔记(一)

    目录 第一周:简单的计算程序 1.1 第一个程序 Hello World! 1.2 变量 1.3 计算 1.4 编程作业及课后讨论 第一周:简单的计算程序 1.1 第一个程序 Hello World! ...

  9. How to pass external configuration properties to storm topology?

    How to pass external configuration properties to storm topology? I want to pass some custom configur ...

随机推荐

  1. Error while trying to retrieve text for error ORA-01019 的解决办法

    这个问题涉及到 64 位的oracle服务, 和32位的客户端导致的问题. 环境如下: win8.1 + 64位oracle 11.1 做服务器, 客户端由于采用32位程序,不支持64位的oracle ...

  2. history and its relevant variables in Linux/GNU and Mac OS history命令以及相关环境变量

    对于Terminalor们,history命令并不陌生,什么!n, !!更是很常用的,而且您在命令行敲的cmds是默认保存在/home/$USER/.bash_history(linux) /User ...

  3. Dijkstra 算法、Kruskal 算法、Prim算法、floyd算法

    1.dijkstra算法 算最短路径的,算法解决的是有向图中单个源点到其他顶点的最短路径问题. 初始化n*n的数组. 2.kruskal算法 算最小生成树的,按权值加入 3.Prim算法 类似dijk ...

  4. new和malloc的区别

    1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符 2.new出来的指针是直接带类型信息的,而malloc返回的都是void*指针. 3.new 建立的是一个 ...

  5. MySQL重置root用户密码的方法

    本教程适用于采用Win2003.WinXP操作系统的迅美VPS和云主机产品. 当管理员忘记MySQL密码怎么办?屡次输入密码,仍然提示错误,网站无法正常运行,数据库也无法管理,管理员束手无策. 网站程 ...

  6. 使用glob()查找文件

    大部分PHP函数的函数名从字面上都可以理解其用途,但是当你看到 glob() 的时候,你也许并不知道这是用来做什么的,其实glob()和scandir() 一样,可以用来查找文件,请看下面的用法:摘自 ...

  7. C#:屏幕显示区域问题

    更改电脑屏幕显示的文字大小后,平面显示区域问题. /// <summary> /// 屏幕显示尺寸 /// </summary> public static Size Revi ...

  8. easyui常现错误

    1.easyui-tabs:当data-options的属性设置为true时,其tab内部的内容显示不出来. 2.设置easyui-panel的title格式及字体大小无效 解决方法:在设置title ...

  9. css弹性盒子学习

    css3弹性盒子是一种布局方式,在适应不同的屏幕大小的时候,能够确保元素拥有更恰当的排布行为.它只是视觉呈现上的,即显示顺序适应显示空间,与源代码无关,源代码顺序不受影响. 定义一个弹性盒子: 在cs ...

  10. webrtc - web 应用相关网站

    很有意思的网站 http://io13webrtc.appspot.com/#1 html5使用webrtc简介 http://www.html5rocks.com/en/tutorials/getu ...