Storm入门

前面介绍了流计算,在流计算领域,一个热门的计算框架就是-Storm。还是先介绍概念。。。

一、Storm是什么

在流处理过程中,我们除了考虑最重要的数据处理的逻辑,还需要维护消息队列和消费者,考虑消息怎么流、怎么序列化等。而Storm就是这样一个流式计算框架,它为你完成了消息传递等这些通用模块,让你专注于实时处理的业务逻辑。

Storm--一种分布式实时计算系统。Storm之于流计算,类似于Hadoop之于批处理。Storm可以简单、高效、可靠的处理流数据,它提供了简单的编程原语,并且支持多种语言,开发人员只需要关注业务逻辑。可以应用到很多领域,例如实时分析、在线机器学习、分布式RPC、ETL等。

下面进一步了解下Storm

二、Storm设计思想

在Storm里面包含几个组件:Streams, Sputs ,Bolts, Topology,Stream Groupings。

1、Streams(流)

Streams是Storm对数据的抽象。Storm处理的数据对象是“流数据”,流数据是一个无限的Tuple序列,这些Tuple序列会以分布式的方式并行创建何处理。

熟悉Python的同学可能对Tuple(元组)更容易理解一些,它就是一个元素的有序序列,每一个Tuple就是一个值列表,列表里的值的类型没有严格的规定,可以是基本类型、字符类型、字节数组也可以是其他可序列化的类型。

2、Spouts(喷口)

Spouts是Storm对数据源头的抽象。Spouts是stream的源头,从外部读取流数据并持续发出Tuple。

3、Bolts(螺栓)

Bolts是Storm对stream的状态转换过程的抽象。Bolts既可以处理tuple,也可以把处理以后的tuple作为新的streams发送给其他的bolts。对tuple的处理逻辑都被封装在bolts中,在bolts中可以对数据执行过滤、聚合、查询等操作。

4、Topology(拓扑)

Topology是Storm对Spouts和Bolts组成的网络的抽象。Topology是Storm中最高层次的抽象概念,可以被提交到Storm集群执行。一个Topology就是又给流转换图,图中的节点是Spouts或Bolts,图中的边表示Bolts订阅了哪个Stream。当Spout或bolt发送元组的时候,会把元组发送到每个订阅了该stream的bolt上进行处理。

topology支持通过各种编程语言来创建、提交topology。

5、Stream Groupings

用于告知topology如何在两个组件之间进行tuple的传送,组件之间可以是spout和bolt之间或者不同bolt之间。stream groupings决定了一个任务在什么时候、以什么形式发送tuple。

Storm中的stream gouping有以下6种方式。

shuffleGrouping:随机分组,把stream中的tuple随机分发给各个bolts的task

fieldsGrouping:按字段分组,相同字段的tuple分配到同一个task中

all Grouping:广播发送,每个task收到所有的tuple

globalGrouping:全局分组,所有的tuple都发送到同一个task中

nonGrouping:不分组,和shuffleGrouping类似,当前task的执行和它的被订阅者在同一个线程中执行

directGrouping:直接分组,直接指定某个task来执行tuple的处理。

三、Storm框架设计

对于Strom框架的理解,类比着hdp可能会更容易理解些。

Strom运行在分布式集群中,我们可以类比下hadoop,hdp上运行的是MR作业,Storm上运行的是Topology。不过MR是有限的,会结束,但是topology会对数据进行持续处理,直到人为终止。

一个Storm集群包含Master节点和Worker节点。

Master节点上运行Nimbus后台程序,类似MR中的JobTracker。负责集群内代码的分发、worker任务的分配和故障监测。

Worker运行Supervisor后台程序,负责监听分配给当前机器的工作,根据Nimbus分配的任务来启动或停止worker进程。每个supervisor有n个worker进程,负责代理task给worker进程,worker再孵化执行线程最终运行task。

worker负责执行特定的task,worker本身不执行任务,而是孵化executors,让executors执行task;executor本质上是worker进程孵化出来的线程,executor运行task都属于同一spout或bolt。task是实际执行的任务处理,或者是Spout或者是Bolt。

storm使用内部消息系统在nimbus和supervisor之间进行通信。

master和worker之间不会直接交互,为了实现master和worker之间的协同,采用zookeeper作为协调组件。zk中存储master和worker的状态信息,以便节点故障时根据zk中状态信息进行快速恢复,保证storm的稳定性。

 

在这样的架构下,storm的工作流程如下图

1、client把topology提交到storm集群

2、提交top后nimbus收集task

3、Nimbus分发task,把分配给Supervisor的task写入zk

4、Supervisor周期性发送心跳表示自己还活着,如果Supervisor挂掉,nimbus将task分发给其他supervisor

5、Supervisor从zk中获取所分配的任务,启动worker进程,woker进程执行任务。

6、task完成后,supervisor等待新的task

7、如果nimbus挂掉,supervisor继续执行自己的task,task完成后,supervisor继续等待新的task

上一篇:讲给Java工程师的史上最通俗易懂Storm教程:大白话介绍


下一篇:storm源码分析研究(十一)