Storm简介——初始Storm

 

1、什么是Stormjava

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

 

2、Storm特色与优点    数据库

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

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

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

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

 

 

3、Storm的应用场景服务器

    目前Storm的使用很是普遍了,在Twitter、Yahoo、腾讯、阿里、新浪等著名公司。并发

     新浪的实时分析平台负载均衡

     腾讯的实时计算平台

     奇虎360的实时平台

     百度的实时系统

     阿里的Jstorm

     ......

4、Storm的系统构架

      

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

 

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

 

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

 

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

 

 

 5、Storm的工做流

       

        一、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。

 

 

6、Storm的并发机制

           

       一、服务器(Nodes):Strom集群能够包含多台服务器,便可以扩展多个Nodes.

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

      三、线程(executor):每一个worker能够运行一个或多个executor。每一个executor能够运行同一个component(spout/bolt)的一个或多个task。

            

       四、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数量是固定不变的了。

 

 

7、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接口实现自定义的数据流分组模型。

     

        八组数据流分方式

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

 

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

 

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

 

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

 

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

 

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

 

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

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

  

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

 

 

7、Storm的数据流    

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

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

相关文章
相关标签/搜索