本文将带你了解Storm核心概念和术语,这也是学习Storm的基础。如果大家还不了解Storm,建议先去Storm官网了解相关的文档,或参考初识Storm一文。
核心概念包括:拓扑 (toplogy)、流 (stream)、元组 (tuple)、spout、bolt。
1. 拓扑 (toplogy)
相信大家在平常的学习或者工作中也接触过拓扑图,简单点说,拓扑图就是将多个结点用边直接连接起来,形成的简单线性图。如下图1所示的这些拓扑图。
但是,Storm中的拓扑有一些不同之处,可以这样理解,storm中的每个结点代表一个简单的处理或者计算过程,每条边代表一个结点的处理结果并传递给下一个结点作为其输入,如下图2所示。
Storm 拓扑就是这样一个计算图,结点代表一些独立的计算,边代表节点间的数据传递。Storm官网的首页的拓扑图更具有代表性,如下图所示。
2. 元组 (tuple)
上面拓扑中提到,结点之间存在数据的传输,元组 (tuple)就是拓扑中结点之间传输数据的形式,它本身是一个有序的数值序列,其中每个值都存在一个命名。简单说,就是结点间的数据是以元组的形式发送和接收的,一个结点可以创建元组,然后发送至任意其他的结点(此操作是可选的),这个发送元组到任意结点的过程,称为元组发送。元组格式展示如下图3所示。
3. 流 (stream)
一个流是一个“无边界的元组序列”。换句话说就是,在拓扑中,一个拓扑可以包含任意数量的流,一个流呢又包含任意多个无边界的元组。在Storm中除了第一个结点是从数据源读取数据外,其他的每个结点可以接受一个或者多个流作为输入。前面也提到过,每个结点会计算或转换输入流中的元组,然后发射新的元组,作为输出流传递给其他结点,而这个输出流对于接收结点来说就是输入流。
复杂流
其实就是节点的输入和输出不只是一对一的存在,可以多个输入流,可以多个输出流,这个可以对照Storm拓扑图理解,那个就是一个复杂流。通常我们业务需求要处理的也是类似的复杂流,一个复杂流例子如图4。
4. spout
spout就是Strom中所谓的第一个结点(水龙头),它是拓扑的流数据源头,spout会从外部的数据源读取数据并且向拓扑中发射数据元组。spout可以监听包括消息队列,数据库或者其他的一些数据源,spout比较简单,没有对数据的处理操作,仅仅作为数据流源头,监听数据源,读取数据,然后向bolt结点发射元组。
5. bolt
bolt就是结点,除了spout以外的结点都是bolt。不同于spout,bolt可以接收输入流的元组,可以对元组进行计算或者转换操作(如过滤、聚合、连接等操作),以及它还负责发射新的元组做为其他bolt的输入流。
bolt和spout的区别已经弄明白了,那它们是如何工作的呢?
在一个拓扑中,通常会存在大量的bolt和多个spout,他们是并行运行的,从Storm拓扑图也不难看出。
6. 总结
至此,Storm 核心概念就都说完了,最后总结一下:
- 首先每个拓扑包含多个结点和边;
- 结点就代表spout或者bolt;
- 边代表流,流是指元组流;
- 一个元组是有序的数值列表,每个数值都赋予一个命名,类似键值对(key-value);
- 一个数据流是在spout和bolt之间或bolt和bolt之间的无边界元组序列;
- spout是拓扑中的数据源头(第一个结点),负责监听数据源和传递发射元组;
- bolt是除spout外其他结点,负责接收spout或者其它bolt的输入元组流,对元组进行计算等操作,以及发射新的元组给其它bolt;
- 一个拓扑中,通常会存在大量的bolt和多个spout,他们是并行运行的。