Storm介绍之概念

2016-11-13  本文已影响0人  Bloo_m

什么是实时流计算?

       主要的处理模式可以分为:流处理,批处理

                流处理是直接处理,有时也分为在线,离线,近线(straight-through process)

                批处理是先存储后处理(store-process)

实时的流计算系统

      Yahoo的S4,S4是一个通用的,分布式的,可扩展的,分区容错的,可插拔的流式系统,主要是为了解决:搜索广告的展现、处理用户的点击反馈

    Facebook使用puma和hbase相结合来处理实时数据,使批处理计算平台具备一定实时计算能力,不过这不算是一个开源的产品,只是内部使用

Storm是什么?

       storm是一个分布式,高容错的实时计算系统,对数据实时计算提供了简单的spout和bolt原语

架构

                      

核心组件

          Storm的内核都是由clojure编写的(大部分扩展工作都是java编写的)

            Nimbus:负责资源分配和任务调度

           Supervisor:负责接收nimbus分配的任务,启动和停止属于自己管理的worker进程

           Worker:运行具体处理组件逻辑的进程,每个Worker都属于一个特定的Topology,每个supervisor节点的worker进程有多个,每个worker使用一个单独的端口,worker对Topology中的每个组件运行一个或多个Executor线程来提供Task的执行服务

          Topology:storm中运行的一个实时应用程序,类似于网络拓扑图的一种虚拟结构.Storm拓扑类似MapReduce任务,一个关键的区别是MapReduce任务运行一段时间后最终会完成,而Storm拓扑一直会运行(直到杀死它),一个Topology是由一组spout组件和Bolt组件组成的图

          Spout:在一个Topology中产生源数据的组件,向Topology中发出的Tuple可以是可靠的,也可以是不可靠的,一个可靠的数据源可以重新发射一个Tuple(如果该Tuple没有被Storm成功处理),但是一个不可靠的消息源Spout一旦发出,一个Tuple就把它彻底"遗忘",也就不可能再发了

         Bolt:消息的处理者,在一个Topology中接收数据然后执行处理的组件

                Bolt的生命周期:首先客户端创建Bolt,然后将其序列化,并提交给集群中的主机,之后集群启动Worker进程,反序列化Bolt,调用prepare方法开始处理元组,接下来,Bolt处理Tuple,Bolt处理一个输入Tuple,发射0个或多个Tuple,然后调用ack通知Storm自己已经处理过这个Tuple了,Storm提供了一个IBasicBolt自动调用ack,Bolt类接收由Spout或者其他上游Bolt类发来的Tuple,对其进行处理

        Tuple:一次消息传递的基本单元

               Tuple的生命周期:storm 通过调用spout的nextTuple方法来获取下一个Tuple,Spout通过open方法参数里面提供的SpoutOutputCollector来发射新tuple到它的其中一个输出消息流,发射tuple的时候spout会提供一个message-id,后面我们会通过这个tuple-id来追踪这个tuple

                   然后,这个发射的tuple被传送到消息处理者Bolt那里,storm会跟踪这个消息的树形结构是否创建,根据message-id调用spout那里的ack函数,以确认tuple是否被完全处理,如果tuple超时就会调用spout的fail方法

                  由此看出同一个tuple不管是acked还是fail都是由创建它的那个spout发出的,所以即使spout在集群环境中执行了很多的task,这个tuple也不会被其他任务调用或生成acked或failed状态,总之,Storm会利用内部的Acker机制保证每个Tuple被可靠地处理,最后,在任务完成后,Spout调用Close方法结束Tuple的使命

         Executor:

                产生于Worker进程内部的线程,会执行同一个组件的一个或者多个Task

       Task:worker中的每一个spout/bolt的线程称为一个Task

       Stream grouping:消息的分组方法

       Worker、Task、Executor三者之间的关系:

                  Worker是进程,Executor对应于线程,Spout或Bolt是一个个的Task;在Storm集群中的一个物理节点启动一个或者多个worker进程,集群中的Topology都是通过这些Worker进程进行的,Worker进程中又会运行一个或多个executor线程,每个Executor线程只运行一个Topology的一个组件(Spout/Bolt)的Task任务,Task又是数据处理的实体单元

                   同一个Worker只执行同一个Topology相关的Task;在同一个Executor中可以执行多个同类型的Task,即在同一个Executor中,要么全部都是Bolt类的Task,要么全是Spout类的Task;在运行时,Spout和Bolt需要包装成一个又一个的Task

                     

与hadoop角色对比

               

Storm数据交互图

              

Topology的提交流程图

                 


数据流模型

      Topology中,Spout是Stream的源头,负责为Topology从特定数据源发射Stream;Bolt可以接收任意多个Stream作为输入,然后进行数据的加工处理过程,如果需要,Bolt还可以发射出新的Stream给下级Bolt进行处理

           

      Stream消息流:Stream消息流是一个有向无界的Tuple序列,这些Tuple以分布式的方式并行地创建和处理,定义消息流主要是定义消息流的Tuple

     Stream:源源不断传递地tuple就组成了stream

     Stream Grouping 消息流

              Stream Grouping(消息流组)就是用来定义一个流如何分配Tuple到Bolt.Storm包括6种流分组类型

                1.随机分组(shuffle Grouping)

                   随机分发Tuple到Bolt的任务,保证每个任务获得相等数量的Tuple

                2.字段分组(Fields Grouping)

                    根据指定字段分割数据流,并分组.这种grouping机制保证相同field值的tuple会去同一个task.例如对于WordCount来说同一个单词会去同一个task

                3.全部分组(AllGrouping)

                     广播发送,将每一个Tuple发送到所有的Task.谨慎使用

               4.全局分组(GlobalGrouping)

                    所有的Tuple会被发送到某个Bolt中id最小的那个task

              5.无分组(NoneGrouping)

                  不关心Tuple发送给哪个Task来处理,等价于ShuffleGrouping

              6.直接分组(DirectGrouping)

                  直接将Tuple发送到指定的Task来处理

特点

            分布式简单

            运维简单

            高度容错

            无数据丢失

            多语言

            低延迟

            高性能

            可扩展

进入Storm安装部署以及API:Storm安装部署和API

上一篇下一篇

猜你喜欢

热点阅读