Storm入门介绍一

概述

离线计算是什么?

批量获取数据,批量传输数据,周期性批量计算数据,数据展示。(形象的比喻:电梯载客,一波一波的来)

代表技术:Sqoop 批量导入数据,HDFS 批量存储数据 ,MapRduce Hive 批量计算数据,azkaban 任务调度。

日常业务:hivesql , 调度平台 ,Hadoop集群运维 ,数据清洗 ,元数据管理 ,数据稽查 ,数据仓库模型架构

流式计算是什么?

数据实时产生,数据实时传说,数据实时计算,数据实时显示。(形象的比喻:商场自动扶梯,来一个上一个)

代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时计算、Redis实时结果缓存

总结:将源源不断产生的数据实时手机并实时计算,尽可能快的得到计算结果,用来支持决策。

离线计算与实时计算的区别

最大的区别:试试收集、实时计算、实时显示

离线计算:一次计算很多条数据

实时计算:数据一条一条的计算

 

Storm是什么?

Storm 是一个开源的分布式计算系统,可以简单、可靠的处理大量的数据流。

Storm 支持水平扩展,具有高容错性,保证每个消息都会得到处理,而且处理速度很快。

Storm 部署和运维都很便捷,更重要的是,可以应用于各种编程语言。

Storm 特点:低延迟、高可用、分布式、可扩展、数据不丢失。提供简单的接口,便于开发。

Storm的应用场景

Storm 处理数据的方式是基于信息的流水线处理,因此特别适合无状态计算,也就是计算单元的依赖的数据全部在接受的信息中可以找到,并且最好一个数据流不依赖另一个数据流。

因此,常常用于

-日志分析,从海量日志分析出特定的数据,并将分析的结果存入外部储存器用于辅助决策。

-管道系统,将一个数据从一个系统传出到另外一个系统,比如从数据库同步到Hadoop

-消息转化器,将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件

-统计分析器,从日志或消息中,提炼某个字段,然后做 count 或 sum计算,最终将统计值存入外部储存器。

 

案例一:一淘-实时分析系统

一淘-实时分析系统:实时分析用户的属性,并反馈给搜索引擎。最初,用户属性分析是通过每天在云梯上定时运行的MR job来完成的。为了满足实时性的要求,希望能够实时分析用户的行为日志,将最新的用户属性反馈给搜索引擎,能够为用户展现最贴近其当前需求的结果。

 

案例二:携程-网络性能监控

携程-网站性能监控:实时分析系统监控携程网的网站性能。利用HTML5获得可用的指标,并记录日志。Storm集群实时分析日志和入库。使用DRPC聚合成报表,通过历史数据对比等判断规则,触发预警事件。

 

案例三:游戏实时运营

一个游戏新版本上线,有一个实时分析系统,收集游戏中的数据,运营或者开发者可以在上线后几秒钟得到持续不断更新的游戏监控报告和分析结果,然后马上针对游戏的参数 和平衡性进行调整。这样就能够大大缩短游戏迭代周期,加强游戏的生命力。

 

案例四:实时计算在腾讯中的运用

实时计算在腾讯的运用:精准推荐(广点通广告推荐、新闻推荐、视频推荐、游戏道具推荐);实时分析(微信运营数据门户、效果统计、订单画像分析);实时监控(实时监控平台、游戏内接口调用)

 

案例五:实时计算在阿里的运用

为了更加精准投放广告,阿里妈妈后台计算引擎需要维护每个用户的兴趣点(理想状态是,你对什么感兴趣,就向你投放哪类广告)。用户兴趣主要基于用户的历史行为、用户的实时查询、用户的实时点击、用户的地理信息而得,其中实时查询、实时点击等用户行为都是实时数据。考虑到系统的实时性,阿里妈妈使用Storm维护用户兴趣数据,并在此基础上进行受众定向的广告投放。


Storm架构

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

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

Worker:运行具体处理组件逻辑的进程。

Task:worker中每一个 spout/blot的线程称为一个task ,在storm0.8之后,task不再于物理线程对应,同一个spout/bolt的task可能共享一个物理线程,该线程成为 executor.

 

Storm编程模型

Storm 结构称为 topology (拓扑),由 stream (数据流) ,spout (喷嘴-数据流的生成者) ,bolt (阀门-数据流的运算者)

组成不同与 Hadoop中的job,Storm 中的 topology会一直运行下去,除非进程呗杀死或取消部署。

Storm 的核心数据结构是 tuple(元组),本质上是包含一个或多个键值对的列表。Stream是由无限制的tuple组成的序列。

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

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

           spout 连接到数据源,将数据转化为一个个的 tuple,并将 tuple作为数据流进行发射。

           开发一个 spout 的主要工作就是利用 API 编写代码从数据源消费数据流。

           spout 通常只负责转换数据、发射数据,通常不会用于处理业务逻辑,从而可以很方便的实现 spout 的复用。

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

           bolt 主要负责数据的运算,将接收到的数据实施运算后,选择性的输出一个或多个数据流。

           一个 bolt 可以接收多个由 spout 或其他 blot 发射的数据流,从而组件出复杂的数据转换和处理的网络拓扑结构。

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

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

 

Stream grouping

Stream grouping:即消息的partition方法。

Stream Grouping定义了一个流在Bolt任务间该如何被切分。这里有Storm提供的6个Stream Grouping类型:

1. 随机分组(Shuffle grouping):随机分发tuple到Bolt的任务,保证每个任务获得相等数量的tuple。

2. 字段分组(Fields grouping):根据指定字段分割数据流,并分组。例如,根据“user-id”字段,相同“user-id”的元组总是分发到同一个任务,不同“user-id”的元组可能分发到不同的任务。

3. 全部分组(All grouping):tuple被复制到bolt的所有任务。这种类型需要谨慎使用。

4. 全局分组(Global grouping):全部流都分配到bolt的同一个任务。明确地说,是分配给ID最小的那个task。

5. 无分组(None grouping):你不需要关心流是如何分组。目前,无分组等效于随机分组。但最终,Storm将把无分组的Bolts放到Bolts或Spouts订阅它们的同一线程去执行(如果可能)。

6. 直接分组(Direct grouping):这是一个特别的分组类型。元组生产者决定tuple由哪个元组处理者任务接收。

 

流式计算整体结构

flume用来获取数据

Kafka用来临时保存数据

Strom用来计算数据

Redis是个内存数据库,用来保存数据

 

Storm在综合项目中

发布了33 篇原创文章 · 获赞 3 · 访问量 5865

猜你喜欢

转载自blog.csdn.net/WandaZw/article/details/83274906