1.Storm概述简介

主要目标:

  1. 离线计算是什么?

  2. 流式计算是什么?

  3. 流式计算与离线计算的区别?

  4. Storm是什么?

  5. Storm与Hadoop的区别?

  6. Storm的应用场景及行业案例

  7. Storm的核心组件(重点)

  8. Storm的编程模型(重点)

  9. 流式计算的一般架构图(重点)

1.流式计算与Storm概述(背景):

  根据业务需求,数据的处理可以分为离线处理和实时(流式)处理,在离线处理方面Hadoop提供了很好的解决方案,Hadoop不仅可以用

来存储海量数据,还以用来计算海量数据。因为其高吞吐、高可靠等特点,很多互联网公司都已经使用Hadoop来构建数据仓库,高频使用

并促进了Hadoop生态圈的各项技术的发展.但是针对海量数据的实时处理却一直没有比较好的解决方案,Storm横空出世,与生俱来的分布式

、高可靠、高吞吐的特性,横扫市面上的一些流式计算框架,渐渐的成为了流式计算的首选框架;

  2013年,阿里巴巴开源了基于storm的设计思路使用java重现编写的流式计算框架JStorm JStorm 是一个类似Hadoop MapReduce的系
统, 用户按照指定的接口实现一个任务,然后将这个任务递交给JStorm系统,Jstorm将这个任务跑起来,并且按7 * 24小时运行起来,一
旦中间一个Worker 发生意外故障, 调度器立即分配一个新的Worker替换这个失效的Worker。因此,从应用的角度,JStorm 应用是一种遵
守某种编程规范的分布式应用。从系统角度, JStorm是一套类似MapReduce的调度系统。 从数据的角度, 是一套基于流水线的消息处理机
制;鉴于大多数企业的生产环境还在使用storm,我们学习的目标还是切换到Apache基金会的storm上来。
2.Storm用来解决什么样的问题(背景):
  信息的时效(实时)性 
  举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这个宝贝马上就可以被卖家搜索出来、点击、购买啦,相反,如果这个宝贝要等到第二天或者更久才可以被搜出来,估计这个大哥就要骂娘了;

3.离线计算是什么?

  离线计算:批量获取数据、批量传输数据、周期性批量计算数据、数据展示

  代表技术:Sqoop批量导入数据、HDFS批量存储数据、MapReduce批量计算数据、Hive批量计算数据、批量计算任务调度

  相关岗位日常业务:
    1,hivesql
    2、调度平台
    3、Hadoop集群运维
    4、数据清洗(脚本语言)
    5、元数据管理
    6、数据稽查
    7、数据仓库模型架构

4.流式计算是什么?

  流式计算:数据实时产生、数据实时传输、数据实时计算、实时展示

  代表技术:Flume实时获取数据、Kafka/metaq实时数据存储、Storm/JStorm实时数据计算、Redis实时结果缓存、持久化存储(mysql)。

  一句话总结:将源源不断产生的数据实时收集并实时计算,尽可能快(依赖外部系统)的得到计算结果

  所以:离线计算和实时计算的最大区别在于:实时计算是:实时收集、实时计算、实时展示的

5.Storm是什么?

  Flume实时采集,低延迟

  Kafka消息队列,低延迟

  Storm实时计算,低延迟

  Redis实时存储,低延迟

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

6.Storm的应用场景及其行业案例:

  Storm用来实时计算源源不断产生的数据,如同流水线生产

6.1:应用场景:

  Storm处理数据的方式是基于消息的流水线处理, 因此特别适合无状态计算,也就是计算单元的依赖的数据全部在接受的消息
中可以找到, 并且最好一个数据流不依赖另外一个数据流。因此,常常用于
    - 日志分析,从海量日志中分析出特定的数据,并将分析的结果存入外部存储器用来辅佐决策。
    - 管道系统, 将一个数据从一个系统传输到另外一个系统, 比如将数据库同步到Hadoop
    - 消息转化器, 将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件
    - 统计分析器,从日志或消息中,提炼出某个字段,然后做count或sum计算,最后将统计值存入外部存储器。中间处理过程可
能更复杂
6.2:典型案例:  
  案列1:一淘-实时分析系统,实时分析用户的属性,反馈给搜索引擎
        一淘-实时分析系统:实时分析用户的属性,并反馈给搜索引擎。最初,用户属性分析是通过每天在云梯上定时运行的MR job来完成的。为满足实时性的要求,希望能够实时分析用户的行为日志,将最新的用户属性反馈给搜索引擎,能够为用户展现最贴近其当前需求的结果
  案列2:实时分析系统监控携程网的网站性能
        携程-网站性能监控:实时分析系统监控携程网的网站性能。利用HTML5提供的performance标准获得可用的指标,并记录日志。Storm集群实时分析日志和入库。使用DRPC聚合成报表,通过历史数据对比等判断规则,触发预警事件。
  案列3:游戏实时运营
        一个游戏新版本上线,有一个实时分析系统,收集游戏中的数据,运营或者开发者可以在上线后几秒钟得到持续不断更新的游戏监控报告和分析结果,然后马上针对游戏的参数 和平衡性进行调整。这样就能够大大缩短游戏迭代周期,加强游戏的生命力
  案列4:实时计算在腾讯的运用
        实时计算在腾讯的运用:精准推荐(广点通广告推荐、新闻推荐、视频推荐、游戏道具推荐);实时分析(微信运营数据门户、效果统计、订单画像分析);实时监控(实时监控平台、游戏内接口调用)
  案列5:阿里妈妈--用户画像,实时计算用户的兴趣数据
        为了更加精准投放广告,阿里妈妈后台计算引擎需要维护每个用户的兴趣点(理想状态是,你对什么感兴趣,就向你投放哪类广告)用户兴趣主要基于用户的历史行为、用户的实时查询、用户的实时点击、用户的地理信息而得,其中实时查询、实时点击等用户行为都是实时数据。考虑到系统的实时性,阿里妈妈使用Storm维护用户兴趣数据,并在此基础上进行受众定向的广告投放。

7.Storm和Hadoop的区别   

   Storm用于实时计算,Hadoop是面向基于内存流转的离线计算。

  Storm处理的数据保存在内存中,源源不断;Hadoop处理的数据保存在文件系统中,一批一批(数据存储的介质不同)

  Storm的数据通过网络传输进来;Hadoop的数据保存在磁盘中。(Hadoop是磁盘级计算,进行计算时,数据在磁盘上,需要读写

磁盘;Storm是内存级计算,数据直接通过网络导入内存。读写内存比读写磁盘速度快n个数量级)

  Storm与Hadoop的架构一样,编程模型相似

  

8.Storm的核心组件(重点):

  

  Nimbus:负责资源分配和任务调度。
  Supervisor:负责接受nimbus分配的任务,启动和停止属于自己管理的worker进程。通过配置文件设置当前supervisor上启动多少个worker
  Worker:运行具体处理组件逻辑的进程。一种是Spout任务,一种是Bolt任务。
  Task:worker中每一个spout/bolt的线程称为一个task. 在storm0.8之后,task不再与物理线程对应,同一个spout/bolt
的task可能会共享一个物理线程,该线程称为executor。

9.Storm的编程模型(重点):

       

  各个组件说明:

  1.DataSource:外部数据源

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

  3.Spout在一个Topology中获取源数据流的组件,通常情况下spout会从外部数据源中读取数据,然后转换为Storm内部的源数据

以Tuple为基本的传输单元下发给Bolt,Spout是一个主动的角色,其接口中有个nextTuple()函数,storm框架会不停地调用此函数,用户

只要在其中生成源数据即可

  4.Bolt:在一个Topology中接收数据然后执行处理的组件,Bolt可以执行过滤、函数操作、合并、写数据库等任何操作。Bolt是一个

被动的角色,其接口中有个execute(Tuple input)函数,在接受到消息后会调用此函数,用户可以在其中执行自己想要的操作。

  5.Tuple:一次消息传递的基本单元。本来应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,

所以tuple中只要按序填入各个value就行了,所以就是一个value list.

  6.Stream grouping:即消息的partition方法。Storm中提供若干种实用的grouping方式,包括shuffle, fields hash, all, global,

none, direct和localOrShuffle等,Stream Grouping定义了一个流在Bolt任务间该如何被切分。

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

  这里有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由哪个元组处理者任务接收。

10.Storm流向整体结构图(重点):

  

其中flume用来获取数据。Kafka用来临时保存数据。Strom用来计算数据。Redis是个内存数据库,用来保存数据。

  

原文地址:https://www.cnblogs.com/yaboya/p/9373385.html