Storm简介——初始Storm

一、什么是Storm

       Strom是由Twitter开源的类似于Hadoop的实时数据处理框架。Strom是分布式流式数据处理系统,强大的分布式集群管理、便捷的针对流式数据的编程模型、高容错保障这些都是其成为流式实时数据处理的首选。

二、Storm特点与优势    

       1)易用:为复杂的流计算模型提供了丰富的服务和编程接口,开发迅速、容易上手学习使用。(开发迅速,容易上手)

       2)容错:具有适应性的容错能力。当工作进程(worker)失败时,Storm可以自动重启这些进程;当一个节点宕机时,上面的所有工作进程都会在其他的节点重新被启动;对于Storm的守护进程,nimbus和supervisor被设计为无状态或快速恢复。(守护进程无状态,worker故障切换)

      3)扩展性:storm作业本质具有并行性,可以跨机器或集群来执行。Topology中各个不同的组件(Spout和Bolt)可以配置为不同的并行度。当集群性能不足时,可以随时增加物理机对并行任务做balance。(线性扩展)

     4)完整性:对数据提供完整性操作:至少处理一次、至多处理一次、处理且仅处理一次。用户可根据自己的需求进行选择。(数据不丢失,准确性)

三、Storm的应用场景

    目前Storm的使用非常广泛了,在Twitter、Yahoo、腾讯、阿里、新浪等著名公司。

     新浪的实时分析平台

     腾讯的实时计算平台

     奇虎360的实时平台

     百度的实时系统

     阿里的Jstorm

     ......

四、Storm的系统构架

      

      1、主节点(Nimbus):运行Nimbus的节点是系统的Master节点,即主节点;Nimbus进程是Storm系统的中心,负责接收用户提交的作业(Storm中即为以jar包形式保存的topology代码),向工作节点分配任务(进程级和线程级)和传输作业副本;并依赖协调节点的服务监控集群的运行状态,提供状态获取端口。Nimbus目前是单独部署的。

      2、从节点(Supervisor):运行supervisor的节点是从节点,即工作节点;supervisor监听所在节点,根据nimbus的委派,启动、停止、撤销或关闭任务的工作进程。工作节点是实时数据处理作业运行的节点。其中、计算在节点上的物理单元是worker,即工作进程;计算的逻辑单元是executor,即计算线程。计算的作业逻辑单元是topology,即拓扑;计算的任务逻辑单元是task,即任务。每个worker执行特定的topology的executor子集,每个executor执行一个或多个task。一个topology主要有两种组件:spout和bolt,分别是流式数据在topology中的起始单元和处理单元。组件可以并行配置,并行的每一份就是一个task,在一个executor中运行。

     3、Web节点(Storm UI): 运行Storm UI后台服务的节点;Storm UI在指定端口提供网页服务。用户可以根据浏览器访问web页面,通过web页面提交、暂停和撤销作业,也可以以只读的方式获取系统配置、作业以及各个组件的运行状态。web节点在逻辑 上是独立的,可以被安装在系统的任意节点实现监控;但是如果需要实现作业的管理,Storm UI必须和Storm nimbus部署在一台机器上,这是因为Storm UI进程会检查本机是否存在nimbus的连接,是否存在可导致UI部分功能无法正常工作。

     4、协调节点(Zookeeper):运行Zookeeper进程的节点;Zookeeper并不是Storm专用的,可以作为一类通用的分布式状态协调服务。nimbus和supervisor之间的所有协调,包括分布式状态维护和分布式配置管理都是通过协调节点实现的。为了实现服务的高可用性,Zookeeper往往是以集群形式提供服务的,即在Storm系统中可以存在多个协调节点。

 五、Storm的工作流

       

        1、Topology:storm中运行的一个实时应用程序,因为每个组件间的消息流动形成逻辑上的一个拓扑结构。

        2、Spout:在一个topology中产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,然后转化为topology内部的源数据。Spout是一个主动的角色,其接口中有一个nextTuple()函数,storm框架会不停地调用此函数,用户只要在其中生成源数据即可。

        3、Bolt:是在一个topology中接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、写数据库等操作。Bolt是一个被动的角色,其接口中有execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。

       4、Tuple:一次消息传递的基本单元。本应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,所以tuple中只要按序填入各个value就行了,所以就是一个value list。

       5、Stream:源源不断传递的tuple就组成了stream。

六、Storm的并发机制

           

       1、服务器(Nodes):Strom集群可以包含多台服务器,即可以扩展多个Nodes.

      2、JVM虚拟机(worker):每台Storm服务器可以起多个JVM虚拟机,即可以扩展为多个worker。

      3、线程(executor):每个worker可以运行一个或多个executor。每个executor可以运行同一个component(spout/bolt)的一个或多个task。

            

       4、Spout/Bolt实例(task):task就是一个spout/bolt实例,是真正执行数据处理的地方。

            

          一个正在运行的拓扑由很多worker进程组成,这些worker进程在storm集群的多台机器上运行。一个worker进程属于一个特定的拓扑并且执行这个拓扑的一个或多个component(spout/bolt)的一个或多个executor。一个worker进程就是一个java虚拟机(JVM),它执行一个拓扑的一个子集。

         一个executor是由一个worker进程产生的一个线程,它运行在worker的java虚拟机里。一个executor为同一component

(spout/bolt)运行一个或多个任务。一个executor总会有一个线程来运行executor所有的task,这说明task在executor内部是串行执行的。

         真正的数据处理是在task里面执行的,在父executor线程执行过程中会运用task。在代码中实现每个spout或bolt是在全集群中以很多task的形式运行的。一个component的task数量在这拓扑的生命周期是固定不变的,但是一个component的executor(线程)数量是随着时间推移发生变化的。说明:threads数量<=task数量。默认情况下task数量被设置成跟executor的数量是一样的,即Storm会在每个线程上执行一个任务。

   

        注意:executor线程的数量在拓扑已经启动后可以发生变化,但是拓扑的task数量是固定不变的了。

七、Storm的数据流

     

         Storm的核心概念是“流”(stream),一个stream相当于一个无限的元组(tuple)序列。Storm提供基用来做流转换的基件是spout和bolt。spout和bolt提供了接口,可以实现这些接口来处理应用程序相关的逻辑。

         

         spout是流的来源。例如:spout可以从一个Kestrel队列来读tuple并且发射(emit)他们从而形成一个流,或者spout可以连接到twitter api来发射一个推文的流。

 

         一个bolt消费任意数量的流,做一些处理,然后可能会发射出新的流。对于复杂的流转换,例如:从一个推文的流计算出一个热门话题的流需要多个步骤、多个bolt。bolt可以通过运行函数来做任何事,如、过滤元组、做流聚合、做流连接、和数据库之间交互等。

       storm使用tuple做数据模型。一个tuple是一个被命名过的值列表,一个tuple中的字段可以是任何类型的对象。是开箱即使用的,storm支持所有的简单数据类型,如字符串、字节数组作为tuple的字段值。如果使用另外一种类型的对象,只需要为这个类型实现一个serializer。topology中的每一个节点都应该为它要发射的元组输出字段。

       为拓扑中的每一个bolt确定输入数据流定义一个拓扑的重要环节。数据流分组定义了在bolt的不同任务(tasks)中划分数据流的方式。在storm中有八种内置的数据流分组方式,而且可以通过customstreamgrouping接口实现自定义的数据流分组模型。

     

        八组数据流分方式

       1、随机分组(shuffle grouping):这种方式下元组会被尽可能的随机地分配到bolt的不同任务(tasks)中,使得每个任务所处理的元组数量能够保持基本一致,以确保集群的负载均衡。

       2、域分组(fields grouping):数据流根据定义的“域”来分组。如:若某个数据流是基于一个名为“user-id”的域进行划分的,那么所有包含相同“user-id”的元组都会被分配到同一个任务中,这样来确保消息的一致性。

       3、部分关键字分组(partial key grouping):这种方式与域分组类似,根据定义的域来对数据流进行分组,不同的是,这种分组方式会考虑下游bolt数据处理的均衡性问题,再输入数据源关键字不平衡时会有更好的性能。

      4、完全分组(all  grouping):这种方式会将数据流同时发送到bolt的所有任务中(即同一个元组会被复制多份然后发送到所有的任务处理)。使用这种方式要格外谨慎。

      5、全局分组(global grouping):这种方式下所有的数据流都被发送到bolt的同一个任务中,也就是id最小的那个任务。

     6、非分组(none grouping):不关心数据流如何分组,目前这种方式的结果和随机分组完全等效,不过在未来storm社区可能考虑通过非分组方式来让bolt和它所订阅的spout或bolt在同一个线程中执行。

     7、直接分组(direct grouping):是一种特殊的分组方式,这种方式使得元组的发送者可以指定下游的哪个任务可以接收这个元组

。只有在数据流被声明为直接数据流时才能使用直接分组。

  

    8、本地或随机分组(local or shuffle grouping):如果在源组件的worker进程里目标有一个或更多的任务线程,元组会被随机分配到那些同进程的任务中。

 

七、Storm的数据流    

       1、更能性保障:多粒度的并行化

       2、非功能性保障:多级别的可靠性

猜你喜欢

转载自www.cnblogs.com/lyywj170403/p/8922184.html