apache storm简介与原理,apachestorm简介



简介 ----------------------------    Storm是一个分布式的、高容错的实时计算系统
   Storm对于实时计算的的意义相当于Hadoop对于批处理的意义。Hadoop为我们提供了Map和Reduce原语,使我们对数据进行批处理变的非常的简单和优美。同样,Storm也对数据的实时计算提供了简单Spout和Bolt原语。
Storm适用的场景:
       1、流数据处理:Storm可以用来用来处理源源不断的消息,并将处理之后的结果保存到持久化介质中。
       2、分布式RPC:由于Storm的处理组件都是分布式的,而且处理延迟都极低,所以可以Storm可以做为一个通用的分布式RPC框架来使用。
Storm的基本概念 --------------------------
首先我们通过一个 storm 和hadoop的对比来了解storm中的基本概念。
  接下来我们再来具体看一下这些概念。
  • Nimbus:负责资源分配和任务调度。
  • Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。
  • Worker:运行具体处理组件逻辑的进程。
  • Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,同一个spout/bolt的task可能会共享一个物理线程,该线程称为executor。
下面这个图描述了以上几个角色之间的关系。

  • Topology:storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构。
  • Spout:在一个topology中产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。Spout是一个主动的角色,其接口中有个nextTuple()函数,storm框架会不停地调用此函数,用户只要在其中生成源数据即可。
  • Bolt:在一个topology中接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。
  • Tuple:一次消息传递的基本单元。本来应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,所以tuple中只要按序填入各个value就行了,所以就是一个value list.
  • Stream:源源不断传递的tuple就组成了stream。
  • stream grouping:即消息的partition方法。Storm中提供若干种实用的grouping方式,包括shuffle, fields hash, all, global, none, direct和localOrShuffle等 

Storm集群组件(Components of a Storm cluster)  --------------------------------------------
    Storm集群看起来类似于Hadoop集群。然而,在Hadoop上你运行的是”MapReduce jobs”,在Storm上你运行的是” topologies”。”Jobs”和”topologies”本身就非常的不同,其中一个主要的一个区别是,MapReduce的任务最终会结束,而拓扑则永远在处理消息(直到你干掉它)。 
    storm集群上有两种类型的节点:主节点(master node)和工作节点(worker node)。主节点运行一个称为Nimbus的守护进程,类似于Hadoop的JobTracker。Nimbus负责分发代码到集群中,分配任务到机器,并且监控失败。 
    每一个工作节点运行一个称为Supervisor的守护进程。supervisor监听分配给这台机器的工作,并且基于Nimbus分配情况在必要时启动和停止工作进程。每一个工作进程执行一个拓扑的子集合;一个运行中的拓扑由横跨多个机器的多个工作进程组成。 
 
    Numbus和Supervisor的所有协调同步工作是由Zookeeper集群完成的。另外,Nimbus和Supervisor守护进程是快速失败和无状态的,所有的状态保存在Zookeeper或者本地磁盘中。这意味着,你可以kill -9 Nimbus或者Supervisor,它们会像什么都没有发生一样再启动起来。这个设计使得Storm集群变得难以置信的稳定。 

拓扑(Topologies) 
    为了在Storm上进行实时计算,你需要创建一个我们称为拓扑的东西。一个拓扑就是一个计算图谱。拓扑中的每一个节点包含着处理逻辑,以及表明数据如何在节点间传递的很多链接。 
    运行一个拓扑非常的简单。首先,你将你所有的代码和依赖打包进一个jar中。然后,运行类似下面这样的命令行: 
  1. storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2  
    上面使用参数arg1和arg2来运行backtype.storm.MyTopology类。这个类的主要功能是定义了拓扑,并且将其提交给Nimbus。storm jar部分负责连接到Nimbus并且上传这个jar文件。 
    因为拓扑的定义就是Thrift结构体,Nimbus是一个Thrift服务,所以你可以创建和提交然一编程语言的拓扑。上面的例子是基于JVM语言实现的最简单方式。

流(Streams) 
    Storm中的核心抽象概念就是流。流是无边界的元组(tuples)的序列。Storm提供以分布式的、可靠的方式转换一个流到一个新流的原语。例如,你可以转换一个微博的流到一个流行话题的流。 
    Storm提供处理流转换的基本原语是spouts和bolts。,实现spout和bolt提供的接口来运行你应用程序相关的逻辑。 
    spout是流的源头。例如,一个spout从Kestrel队列读取元组,然后作为流发射(emit)它们。一个spout也可以连接到Twitter API,然后发射一个微博的流。    通常Spout会从外部数据源(队列、数据库等)读取数据,然后封装成Tuple形式,之后发送到Stream中。Spout是一个主动的角色,在接口内部有个nextTuple函数,Storm框架会不停的调用该函数。  
    一个bolt消费任意数量的输入流,进行一些处理,然后可能发射新的流。复杂的流转换,例如从微博流中计算流行话题的流,需要更多的步骤以及更多的bolt。bolt可以干任意事情,从运行函数,过滤元组,聚合(aggregations)流,连接(joins)流,到与数据库交互,等等。   
    spout和bolt组成的网络被打包进一个拓扑中,这就是你提交给Storm集群执行的最高层次抽象。拓扑就是一个流的转换图谱,每一个节点就是一个spout或者bolt。图中的边表示哪个流被哪个流订阅。当一个spout或者bolt发射一个元组到一个流,也会发送这个元组到每一个订阅这个流的bolt。 
 
    拓扑中节点间的链接表示元组该如何被传递。例如,Spout A和Bolt B之间有一个链接,Spout A到Bolt C有一个链接,Bolt B到Bolt C有一个链接,那么每次Spout A发射一个元组,也会发送这个元组到Bolt B和Bolt C。Bolt B的所有输出元组也会到达Bolt C。      Storm拓扑中的每个节点是并行执行的。在你的拓扑中,你可以为每个节点指定你想要的并行度(parallelism),然后Storm会在集群中分配这么多数量的线程来执行。 
    拓扑永远在运行中,除非你干掉它。Storm会自动重新分配失败的任务。另外,Storm保证不会有数据丢失,及时机器挂掉了以及消息丢失了。 




相关内容

    暂无相关文章