Java Storm Hello World 入门起手例子

1,Storm程序再Storm集群中运行的示例图如下:

2,Storm的几个核心概念名词

  • Nimbus:即Storm的Master,负责资源分配和任务调度。一个Storm集群只有一个Nimbus。
  • Supervisor:即Storm的Slave,负责接收Nimbus分配的任务,管理所有Worker,一个Supervisor节点中包含多个Worker进程。
  • Worker:工作进程,每个工作进程中都有多个Task。
  • Task:任务,在 Storm 集群中每个 Spout 和 Bolt 都由若干个任务(tasks)来执行。每个任务都与一个执行线程相对应。
  • Topology:计算拓扑,Storm 的拓扑是对实时计算应用逻辑的封装,它的作用与 MapReduce 的任务(Job)很相似,区别在于 MapReduce 的一个 Job 在得到结果之后总会结束,而拓扑会一直在集群中运行,直到你手动去终止它。拓扑还可以理解成由一系列通过数据流(Stream Grouping)相互关联的 Spout 和 Bolt 组成的的拓扑结构。
  • Stream:数据流(Streams)是 Storm 中最核心的抽象概念。一个数据流指的是在分布式环境中并行创建、处理的一组元组(tuple)的无界序列。数据流可以由一种能够表述数据流中元组的域(fields)的模式来定义。
  • Spout:数据源(Spout)是拓扑中数据流的来源。一般 Spout 会从一个外部的数据源读取元组然后将他们发送到拓扑中。根据需求的不同,Spout 既可以定义为可靠的数据源,也可以定义为不可靠的数据源。一个可靠的 Spout能够在它发送的元组处理失败时重新发送该元组,以确保所有的元组都能得到正确的处理;相对应的,不可靠的 Spout 就不会在元组发送之后对元组进行任何其他的处理。一个 Spout可以发送多个数据流。
  • Bolt:拓扑中所有的数据处理均是由 Bolt 完成的。通过数据过滤(filtering)、函数处理(functions)、聚合(aggregations)、联结(joins)、数据库交互等功能,Bolt 几乎能够完成任何一种数据处理需求。一个 Bolt 可以实现简单的数据流转换,而更复杂的数据流变换通常需要使用多个 Bolt 并通过多个步骤完成。
  • Stream grouping:为拓扑中的每个 Bolt 的确定输入数据流是定义一个拓扑的重要环节。数据流分组定义了在 Bolt 的不同任务(tasks)中划分数据流的方式。在 Storm 中有八种内置的数据流分组方式。
  • Reliability:可靠性。Storm 可以通过拓扑来确保每个发送的元组都能得到正确处理。通过跟踪由 Spout 发出的每个元组构成的元组树可以确定元组是否已经完成处理。每个拓扑都有一个“消息延时”参数,如果 Storm 在延时时间内没有检测到元组是否处理完成,就会将该元组标记为处理失败,并会在稍后重新发送该元组。

3,拓扑Topology

Topology是我们开发程序主要的用的组件。
Topology则是使用Spout获取数据,Bolt来进行计算。
一个Topology由一个或者多个的Spout和Bolt组成。

上面是三个拓扑,spout单词就是水龙头的意思,数据从spout出来,经过bolt处理,处理完可以结束(第一个topo),也可以继续流向下一个bolt(第二个topo)。一个topo的水龙头可以是多个(第三个topo)

4,Java代码实例

例子简单说明:

0,数据源,水龙头 spout 每秒获取一个“句子”到拓扑topo去,
1,然后这个数据(英文句子)被split by 空格;
2,统计每个单词的个数;
3,合计一下每个单词的总的count数。

测试使用的依赖:可以自己在maven仓库搜最新的版本。https://mvnrepository.com/artifact/org.apache.storm/storm-core

    compile group: 'org.apache.storm', name: 'storm-core', version: '1.2.3'

我把代码放在github上了,链接:https://github.com/cmshome/JavaNote/tree/master/storm

基本上是可以直接运行的。代码就不在这贴了。浪费地方。

 

Exception in thread "main" java.lang.IllegalAccessError: tried to access method clojure.lang.RT.classForNameNonLoading(Ljava/lang/String;)Ljava/lang/Class; from class org.apache.storm.daemon.nimbus$loading__5340__auto____6155 at org.apache.storm.daemon.nimbus$loading__5340__auto____6155.invoke(nimbus.clj:16) at org.apache.storm.daemon.nimbus__init.load(Unknown Source) at org.apache.storm.daemon.nimbus__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at clojure.lang.RT.loadClassForName(RT.java:2098) at clojure.lang.RT.load(RT.java:430) at clojure.lang.RT.load(RT.java:411) at clojure.core$load$fn__5018.invoke(core.clj:5530) at clojure.core$load.doInvoke(core.clj:5529) at clojure.lang.RestFn.invoke(RestFn.java:408) at clojure.core$load_one.invoke(core.clj:5336) at clojure.core$load_lib$fn__4967.invoke(core.clj:5375) at clojure.core$load_lib.doInvoke(core.clj:5374) at clojure.lang.RestFn.applyTo(RestFn.java:142) at clojure.core$apply.invoke(core.clj:619) at clojure.core$load_libs.doInvoke(core.clj:5417) at clojure.lang.RestFn.applyTo(RestFn.java:137) at clojure.core$apply.invoke(core.clj:619) at clojure.core$require.doInvoke(core.clj:5496) at clojure.lang.RestFn.invoke(RestFn.java:408) at org.apache.storm.testing$loading__5340__auto____6153.invoke(testing.clj:17) at org.apache.storm.testing__init.load(Unknown Source) at org.apache.storm.testing__init.<clinit>(Unknown Source) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at clojure.lang.RT.loadClassForName(RT.java:2098) at clojure.lang.RT.load(RT.java:430) at clojure.lang.RT.load(RT.java:411)
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页