Storm核心概念剖析

标签: storm 核心 概念 | 发表时间:2015-03-20 12:42 | 作者:iamzhongyong
分享到:
出处:http://www.iteye.com

最近团队中有分析的场景,用到了JStorm来做数据的实时分析,于是花时间对于一些概念做了了解。

 

什么是Storm?

这个的话出来应该有几年时间了,阿里巴巴也重写了一套JStorm,核心的类名都是服用的Storm的,他是一套实时数据处理系统,容错行好,然后足够稳定,目前很多数据实时分析的场景,选择Storm的越来越多了。

 

 

核心概念介绍

    Nimbus:负责在集群里面发送代码,分配工作给机器,并且监控状态。全局只有一个。相当于master的角色。

    Supervisor:监听分配给它那台机器的工作,根据需要启动/关闭工作进程Worker。每一个要运行Storm的机器上都要部署一个,并且,按照机器的配置设定上面分配的槽位数。

    zookeeper:Storm重点依赖的外部资源。Nimbus和Supervisor甚至实际运行的Worker都是把心跳保存在Zookeeper上的。Nimbus也是根据Zookeerper上的心跳和任务运行状况,进行调度和任务分配的。两者之间的调度器。

    Spout:在一个topology中产生源数据流的组件。通常情况下spout会从外部数据源中读取数据,然后转换为topology内部的源数据。Spout是一个主动的角色,其接口中有个nextTuple()函数,storm框架会不停地调用此函数,用户只要在其中生成源数据即可。

    Bolt:在一个topology中接受数据然后执行处理的组件。Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个被动的角色,其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。   

    Topology:storm中运行的一个实时应用程序,因为各个组件间的消息流动形成逻辑上的一个拓扑结构。

    Worker:具体处理组建逻辑的进程,

    Task:不再与物理进程对应,是处理任务的线程,

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

    Tuple:一次消息传递的基本单元。本来应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,所以tuple中只要按序填入各个value就行了,所以就是一个value list.

 

 

整体物理布局

放一张Nimbus和Supervisior的关系图



 

 

 

数据处理的流程

Topology是一个完成的数据处理流程,在Nimbus提交jar,然后Nimbus分发到Supervisior中,Sport负责数据流的读入,是入口,然后Bolt是处理数据加工数据的节点,中间数据被封装在Tuple中,然后Bolt节点可以产生新的Tuple。总体流程图如下



 

 

 

Storm如何保证消息被最终处理

总体的流程介绍,首先Spout发完tuple后发送一条Ack消息给Acker线程,告诉Acker自己发送了哪些tuple需要ack,每一个Bolt 的 task 在执行完对tuple的处理之后,需要手动的ack一下,ack的时候发送一条Ack消息给Acker线程,告知自己要ack的tuple和需要下面的节点ack的tuple,当Acker收到所有的ack的时候就向Spout发送一条ack消息,通知这棵树上的tuple被完整的处理了。

每当一个Spout发送出一个tuple,就会在拓扑中产生了一棵由tuple构成的树,Jstorm中为每棵树设置了一个rootID来唯一的标示这棵树。



 

 

 

 

 

Storm如何存储数据

严格来讲,Storm中设计的组建,没有专门存储数据的,一般情况下,会借助第三方的存储,例如mysql、Nosql 等,Bolt的节点,可以用于存储计算的中间结果或者最终结果。

从这里看,Storm在取舍上拿捏的恰到好处,发挥里实时处理数据的核心场景。

 

 

Spout和Bolt为啥需要实现序列化

这两个核心的接口,都实现了序列化,在开发web类系统的时候,一般接口或者操作类,是没有必要实现序列化接口的,这里为啥需要呢。

深入理解一些Storm的机制,一个topology程序提交到集群,是先提交到Nimbus的,然后由其进行分发,分发是跨进程的,到了另外一个进程中,是需要反序列化出来这个处理类的。

 

 

Storm中的grouping机制有那些

一个 Bolt 可以设置为多个 Task 并发执行数据处理任务,订阅了一个 Spout 的 Stream,那么应该把 Spout 的数据发送给哪一个具体的Task执行,这个是由grouping的方式决定的。

1、随机分组,伪随机,按照一定的逻辑均匀的分发

2、特定字段分组

3、真正的随机分组

4、广播,每个都发一遍

5、直接制定那个任务接收



 

 

 

事务拓扑是怎么回事

事务拓扑,保证流入拓扑的数据能够被完整的处理且处理一次;

Acker拓扑,保证流入拓扑的数据能够被完整的处理,但不保证不重复;

普通拓扑,不保证流入拓扑的数据能够被完整的处理;

 

 

如何测试这种编程模型的系统呢

简单想了一些测试的思路,这种实时处理,数据是流动的,测试难度比较大

1、验证数据,截取特定时间点的分析结果数据快照,然后利用这些时间在离线的分析集群里面对照写分析逻辑,看结果是否一致;

2、验证数据分析处理逻辑,中间的Bolt阶段,涉及到数据的加工分析以及过滤,可以mock数据输入,验证计算逻辑是否准确;

3、测试环境下,模拟有可能异常的业务数据,流入系统,看系统的容错机制如何;

 

 

Spout如何获取数据

1、直接链接,Spout作为数据输入的源头,启动线程直接链接对应的数据源,拉取特定条件的数据;

2、通过队列过度,不是直接的方式,通过消息队列来进行过度;

3、外部系统通知,消息系统通知到Spout,然后转换为Tuple进行传输;

 

 

实时计算业务场景举例

1、日志分析

例如应用系统产生大量的业务日志,这些例如网关系统的API调用情况日志,这些日志,不太适合马上存入数据库,需要进行加工,日志文件的量又非常大,所以没法直接统计,这时候可以通过Storm来进行分析。

2、大数据实时统计

互联网的数据量是海量的时候,没有办法在数据库层面直接SQL来进行统计,需要对于产生的数据,进行二次加工,然后产出结果,正好把实时变化的数据流到storm中处理一遍。

3、管道传输

例如有数据需要从A系统流道B系统,这时候需要中间处理一下,场景是不是很切和。

 

 

参考文章:

http://storm.apache.org/documentation/Concepts.html 

http://tech.uc.cn/?p=2159

http://xumingming.sinaapp.com/category/storm/

http://www.searchtb.com/2012/09/introduction-to-storm.html 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [storm 核心 概念] 推荐:

Storm核心概念剖析

- - 互联网 - ITeye博客
最近团队中有分析的场景,用到了JStorm来做数据的实时分析,于是花时间对于一些概念做了了解. 这个的话出来应该有几年时间了,阿里巴巴也重写了一套JStorm,核心的类名都是服用的Storm的,他是一套实时数据处理系统,容错行好,然后足够稳定,目前很多数据实时分析的场景,选择Storm的越来越多了.

Maven 3 入门 -- 核心概念

- - 开源软件 - ITeye博客
例如上篇helloworld的pom.xml配置文件中的. 其实就是坐标,那么Maven的坐标元素包括groupId、artifactId、version、packaging、classifier. 当一个项目通过依赖,插件或者父项目引用与另外一个项目关联的时候,Maven通过坐标来精确定位一个项目.

storm简介

- - 搜索技术博客-淘宝
伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样、更加便捷,同时对于信息的时效性要求也越来越高. 举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了.

Storm Trident 学习

- - 小火箭
Storm支持的三种语义:. 至少一次语义的Topology写法. 参考资料: Storm消息的可靠性保障 Storm提供了Acker的机制来保证数据至少被处理一次,是由编程人员决定是否使用这一特性,要使用这一特性需要:. 在Spout emit时添加一个MsgID,那么ack和fail方法将会被调用当Tuple被正确地处理了或发生了错误.

Storm实战之WordCount

- - 编程语言 - ITeye博客
 在全面介绍Storm之前,我们先通过一个简单的Demo让大家整体感受一下什么是Storm. 本地模式(Local Mode): 即Topology(相当于一个任务,后续会详细讲解)  运行在本地机器的单一JVM上,这个模式主要用来开发、调试. 远程模式(Remote Mode):在这个模式,我们把我们的Topology提交到集群,在这个模式中,Storm的所有组件都是线程安全的,因为它们都会运行在不同的Jvm或物理机器上,这个模式就是正式的生产模式.

maven用途、核心概念、用法、常用参数和命令、扩展

- - 互联网 - ITeye博客
本文由浅入深,主要介绍 maven的用途、 核心概念(Pom、Repositories、Artifact、Build Lifecycle、Goal)介绍、 用法( Archetype意义及 创建各种项目)、 maven 常用参数和命令 以及简单故障排除 、maven扩展(eclipse、cobertura、findbugs、插件开发)、 maven配置.

storm常见问题解答

- - BlogJava-庄周梦蝶
    最近有朋友给我邮件问一些storm的问题,集中解答在这里. 一、我有一个数据文件,或者我有一个系统里面有数据,怎么导入storm做计算. 你需要实现一个Spout,Spout负责将数据emit到storm系统里,交给bolts计算. 怎么实现spout可以参考官方的kestrel spout实现:.

Storm 实时性分析

- - CSDN博客架构设计推荐文章
都说Storm是一个实时流处理系统,但Storm的实时性体现在什么方面呢. 首先有一个前提:这里的实时性和我们通常所说的实时系统(芯片+汇编或C编写的实时处理软件)的实时性肯定是没法比的,也不是同一个概念. 这里的实时性应该是一个相对的实时性(相对于Hadoop之类 ). 总结一下,Storm的实时性可能主要体现在:.

那些storm的坑坑

- - 开源软件 - ITeye博客
转载请声明出处:http://blackwing.iteye.com/blog/2147633. 在使用storm的过程中,感觉它还是不如hadoop那么成熟. 当然,它的流式处理能力挺让人眼前一亮,以前做的个性化推荐都是离线计算,现在总算把实时部分也加上了. 总结一下storm使用的些心得:. 1.尽量把大量数据处理行为分拆成多个处理component.

storm准实时应用

- - CSDN博客推荐文章
1 应用背景: 需要实时统计用户的登陆数,在线人数,活跃时间,下载等指标的数据,或者清洗后移到hdfs上.         1) 客户端产生数据---.         2) kafka-生产者实时采集数据(保留7天)-----.         3) storm实时消费数据,处理数据.         4)把实时数据统计结果缓存到memcached 中.