斯特罗姆基础

  

斯特罗姆经典图谱:

  

斯特罗姆基础

  

斯特罗姆基础

  
      <李>拓扑李   <李>流李   <李>滔滔不绝的   <李> 螺栓   <李> 流分组   <李> 可靠性   <李> 任务   <李>工人李   <李> 配置   
  <人力资源/>   

1,拓扑

  

一个拓扑是滔滔不绝的和螺栓组成的图,通过流分组将图中的壶嘴和螺栓连接起来,如下图:
斯特罗姆基础”> <br/>一个拓扑会一直运行直到你手动杀死掉,风暴自动重新分配执行失败的任务,并且风暴可以保证你不会有数据丢失(如果开启了高可靠性的话)。如果一些机器意外停机它上面的所有任务会被转移到其他机器上。<br/>运行一个拓扑很简单。首先,把你所有的代码以及所依赖的罐子打进一个jar包。然后运行类似下面的这个命令:</p>
  <pre> <代码>风暴jar所有代码。jar backtype.storm。MyTopology __arg1最长</代码> </pre>
  <p>这个命令会运行主类:backtype.strom。MyTopology,参数是__arg1、最长。这个类的主要函数定义这个拓扑并且把它提交给Nimbus.storm jar负责连接到灵气并且上传jar包。<br/>拓扑的定义是一个节俭结构,并且灵气就是一个节俭服务,你可以提交由任何语言创建的拓扑上。面的方面是用基于jvm的语言提交的最简单的方法。</p>
  <人力资源/>
  </h3> <h3> 2,流
  <p>消息流流是风暴里的关键抽象。一个消息流是一个没有边界的元组序列,而这些元组序列会以一种分布式的方式并行地创建和处理,通过对流中元组序列中每个字段命名来定义流。在默认的情况下,元组的字段类型可以是:整数,长,短,字节,字符串,翻倍,浮动,布尔和字节数组。你也可以自定义类型(只要实现相应的序列化器)。<br/>每个消息流在定义的时候会被分配给一个id,因为单向消息流使用的相当普遍,OutputFieldsDeclarer定义了一些方法让你可以定义一个流而不用指定这个id。在这种情况下这个流会分配个值为“默认”默认的id。<br/>风暴提供的最基本的处理流的原语是壶嘴和螺栓。你可以实现壶嘴和螺栓提供的接口来处理你的业务逻辑。</p>
  <人力资源/>
  </h3> <h3> 3,滔滔不绝的说
  <p>消息源壶嘴是风暴里面一个拓扑里面的消息生产者。一般来说消息源会从一个外部源读取数据并且向拓扑里面发出消息:tuple.Spout可以是可靠的也可以是不可靠的。如果这个元组没有被风暴成功处理,可靠的消息源滔滔不绝的说可以重新发射一个元组,但是不可靠的消息源滔滔不绝的说一旦发出一个元组就不能重发了。<br/>消息源可以发射多条消息流流。使用OutputFieldsDeclarer.declareStream来定义多个流,然后使用SpoutOutputCollector来发射指定的流。<br/>壶嘴类里面最重要的方法是nextTuple。要么发射一个新的元组到拓扑里面或者简单的返回如果已经没有新的元组。要注意的是nextTuple方法不能阻塞,因为风暴在同一个线程上面调用所有消息源壶嘴的方法。<br/>另外两个比较重要的壶嘴方法是ack和fail.storm在检测到一个元组被整个拓扑成功处理的时候调用ack,否则调用fail.storm只对可靠的壶嘴调用ack和失败。</p>
  <人力资源/>
  <h3> 4,螺栓/h3>
  <p>所有的消息处理逻辑被封装在螺栓里面.Bolts可以做很多事情:过滤,聚合,查询数据库等等。<br/>螺栓可以简单的做消息流的传递。复杂的消息流处理往往需要很多步骤,从而也就需要经过很多螺栓。比如算出一堆图片里面被转发最多的图片就至少需要两步:第一步算出每个图片的转发数量。第二步找出转发最多的前10个图片。(如果要把这个过程做得更具有扩展性那么可能需要更多的步骤)。<br/>螺栓可以发射多条消息流,使用OutputFieldsDeclarer.declareStream定义流,使用OutputCollector.emit来选择要发射的流。<br/>螺栓的主要方法是执行,它以一个元组作为输入,螺栓使用OutputCollector来发射tuple,螺栓必须要为它处理的每一个元组调用OutputCollector的ack方法,以通知风暴这个元组被处理完成了,从而通知这个元组的发射者,一般的流程是:螺栓处理一个输入元组,发射0个或者多个元组,然后调用ack通知风暴自己已经处理过这个元组了.storm提供了一个IBasicBolt会自动调用ack。</p>
  <人力资源/>
  <h3> 5,流分组/h3>
  <p>定义一个拓扑的其中一步是定义每个螺栓接收什么样的流作为输入.stream分组就是用来定义一个流应该如果分配数据给螺栓上面的多个任务。<h2 class=斯特罗姆基础