文档章节

Storm[技术博客] Storm数据流模型的分析以及讨论

止静
 止静
发布于 2014/06/24 17:59
字数 1558
阅读 362
收藏 1

Storm 是一个开源的实时计算系统,它提供了一系列的基本元素用于进行计算:

1 Topology 

2 Stream

3 spout

4 bolt


在我们提交我们的topology的时候,一旦你提交了你的topology到你的集群之中后,除非你显示的去停止任务

集群中间的topology会一直的在运行


计算任务Topology是由不同的Spouts 和 bolts,通过数据流 Stream连接起来的图,下面是一个Topology的结构示意图


其中包括了


1 :  Spout: Strom 中的消息源头,用于为Topology来生产消息(数据),一般是从外部的数据源开始读取数据,在我们的真实环境之中,我们采用的是 kafka-Storm 流式对接的接口,所以我们 使用的Spout为 :kafkaSpout


2 Bolt, Storm中的消息处理者,用于为Topology 进行消息的处理,Bolt,可以执行如下的几种操作:

         2.1 :过滤

         2.2: 聚合

         2.3: 查询数据库

                  等几种操作,并且可以一级一级的进行处理,最终Topology会被提交到Storm集群中运行,也可以通过命令停止topology的运行,并且将占用的资源归还给Storm集群。



Storm 数据流模型


数据流的模型是Storm中对数据进行的抽象,它是时间上无界的tuple的元祖,在topology之中,Spout是bolt的源头,

bolt是对于Spout的消费者,负责Topology从特定数据源发射Stream,bolt可以接受任意多个Stream输入,然后进行数据的加工处理工作,如果需要,bolt还可以发射出新的Stream给下一级Bolt进行处理


下面是一个Topology内部Spout和Bolt之间的数据流关系:




topology中每一个计算组件(Spout和bolt) 都有一个并行度来控制,在创建Topology时可以进行指定,Storm在集群内分配对应并行度个数的线程来同时执行这一个组件


那么,有一个这样的问题: 既然对于一个Spout,或Bolt,都会有多个task线程来运行,那么如何在两个组件之间发送tuple 元祖了?


Storm 提供了好几种数据流的分发策略用来解决这一个问题,在Topology定义的时,需要为每一个bolt指定接受什么样的Stream作为它输入


目前Storm中提供了一下的7种Stream Grouping


Shuffle Grouping、

Fields Grouping、

All Grouping、

Global Grouping、

Non Grouping、

Direct Grouping、

Local or shuffle grouping


一种Storm不能支持的场景

如果您阅读到这里,那么您可以细细的回想起来,当我们每一个业务逻辑都被一个Topolo持有的时候,

只能在Topology内按照 “发布-订阅”方式在不同的计算组件(spout/bolt)之间进行数据的处理,而Stream在

Topology之间是无法流动的。


很多时候,开始需要把你所有的业务逻辑写到你的一个Topology之中,请不要忘记:Stream在topology之间是无法流动的


也就是意味着一个业务逻辑的过程,不能够和另外的一个业务过程进行通信

我们假设现在有这样的一个Topology1,在整个Topology的过程之中,通过初步的 filter,join bolt,Business1

Bolt,其中,Filter Bolt用于对数据的过滤,join Bolt用于数据流的聚合,如下图所示:

目前这个Topology已经被提交到集群了,那么,如果我们需要一个新的业务逻辑,而

这个Topology的特点是和Topology1 公用的数据源,而且前期的预处理过程是一样的

那么这时候Storm 怎么满足这一需求?


1 第一: kill掉原先的topology,然后实现bussiness Bolt的计算逻辑,并且重新打包形成一个新的

topology计算任务的jar 包后,提交到Storm集群之中重新运行,那么目前,我们的结构图如下所示:

这样的过程之中,来自于不同数据源的处理过程,经过处理以后,经过join以后,被发送到两个业务逻辑的处理Bolt之中。


第一种方式的缺陷:

    Topology 需要重新来部署,并且状态会丢失。而且需要修改你自身的topology结构,失去了稳定性的保证


2:第二种方式:

同一份的数据源被被两份处理流程所消费。无疑增加了External Data Source的负载压力,而且会导致我们的发射数据在集群之中被传输两份,一旦数据重复读取的因子超过2,那么对Storm 的计算Slot的浪费很严重


3 第三种方式

   ok,看了以上两种方式以后,也许你会提出下面的解决方案,通过kafka这样的消息中间件,来实现不同Topology的

Spout 共享数据源头,而且这样可以做到 

                            3.1:【消息可靠传输】    

                            3.2: 【消息rewind回传等】

     有关kafka-Storm的接入组件,请参考 【至静】所写的其他kafka有关的博文


对于消息中间件的引入,一方面减少了对减少对External Data Source的重复访问压力,而且通过消息中间件,我们屏蔽了External Data Sourcede 的重复访问压力


总结: 到目前为止,我们的流式系统还不能够在各个 Topology之间拥有Stream与Stream 之间的数据转发。

个人觉得,Storm有必要实现不同Topology之间Stream的共享,这个至少可以在不损失Storm现有功能的前提下,使得Storm在处理实际生产环境下的一些应用场景时更加从容应对。

至于如何在现有Storm的基础上实现这一需求,可能的方式很多。一种简单的方式是通过Zookeeper来集中存储、动态感知Topology之间Stream的“发布-订阅”关系,同时在Storm的消息分发过程中对这种情况加以处理。

以上观点,如有欠缺不足之处,还请指出。


© 著作权归作者所有

止静
粉丝 122
博文 134
码字总数 125762
作品 0
东城
技术主管
私信 提问
使用 Twitter Storm 处理实时的大数据

使用 Twitter Storm 处理实时的大数据 流式处理大数据简介 IBM DW/M. Tim Jones, 独立作家, 顾问 简介: Storm 是一个开源的、大数据处理系统,与其他系统不同,它旨在用于分布式实时处理且与...

IBMdW
2012/12/06
6.4K
3
Apache Storm简介及安装部署

Apache Storm是一个分布式的、可靠的、容错的实时数据流处理框架。它与Spark Streaming的最大区别在于它是逐个处理流式数据事件,而Spark Streaming是微批次处理,因此,它比Spark Streaming...

风火数据
2018/07/20
0
0
Apache Storm 的历史及经验教训

Apache Storm 最近成为了ASF的顶级项目,这对于该项目和我个人而言是一个重大的里程碑。很难想像4年前Storm只是我脑海中的一个想法,但现在却成为了一个有着大社区支持并被无数企业使用的繁荣...

run_mei
2014/10/14
1.2W
10
Hadoop、storm和Spark Streaming简单介绍(非原创)

文章大纲 一、Hadoop是什么 二、storm是什么 三、Spark Streaming是什么 四、Spark与storm比较 五、参考文章 一、Hadoop是什么 1. 简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架...

故事爱人
2019/06/14
0
0
Storm 并非完全适合所有实时应用

流数据的迅速崛起带来了一类全新的应用开发技术。为了应对不断增长的数据(如物联网和机器通信产生的大量数据),同时,利用实时个性化技术改进在线用户体验,越来越多的应用开发引入了流数据...

亚当李
2014/12/18
1.5W
9

没有更多内容

加载失败,请刷新页面

加载更多

工作自由--2020年开篇,开启一个项目:工作自由 worksolo.cn

新年伊始,我突发奇想,也是很多人敢想而不敢做的事情,下面我以一个多年软件开发从业者的角度去思考,去设计这个项目,当然希望看到这篇文章的你可以给我更多思路: 项目名称:工作自由 域名...

_aron_
22分钟前
14
0
王道 第一章 计算机系统概述

这门课学的是逻辑实现,不是具体的机型 主要内容: 基本部件的结构和组织方式 基本运算的操作原理 基本部件和单元的设计思想 处理器+内存=计算机 存储器 存储器(高速缓存、主存储器、虚拟存...

heronos
今天
81
0
SpringBoot+Mybatis+Thymeleaf-Build Blog site_1

1、快速构建Springboot项目 (1)、 Spring Boot 项目目录结构介绍 (2)、 Spring Boot 项目启动的几种方式 2、 (1)、hello blog (2)、 DispatchServlet 配置 (3)、 静态 web 资源如何...

杨木发
今天
128
0
关于docker0: iptables: No chain/target/match by that name的问题解决

由于Docker 0默认网桥的iptables策略冲突问题,将导致一些web server启动时出现如下错误: docker: Error response from daemon: driver failed programming external connectivity on endpo......

王焱君
今天
103
0
js 下载 canvas 兼容移动端

很蛋疼的问题PC上好好的, 移动端下载不了 , 貌似前端 js 生成的时 base64 格式的 图片数据,移动端无法直接下载, 但是chrome 移动端和pc端都没问题, 国产的几个浏览器全部挂了 之前的下载方式...

阿豪boy
昨天
96
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部