1 为什么要使用Storm?

Apache Storm是一款免费且开源的分布式实时计算系统。

Storm可以轻松地可靠地处理无限数据流,从而实时处理Hadoop进行批处理的操作。Storm很简单,可以与任何编程语言一起使用,并且使用起来非常有趣!

Storm有许多用例:实时分析,在线机器学习,连续计算,分布式RPC,ETL等等。Storm速度很快:基准测试表明,每个节点每秒处理超过一百万个元组。它具有可扩展性,容错性,可确保您的数据得到处理,并且易于设置和操作。

Storm集成了您已经使用的排队和数据库技术。Storm拓扑消耗数据流,并以任意复杂的方式处理这些数据流,然而需要重新分配计算每个阶段之间的数据流。

2 storm特点:
编程简单:开发人员只需要关注应用逻辑,而且跟Hadoop类似,Storm提供的编程原语也很简单
高性能,低延迟:可以应用于广告搜索引擎这种要求对广告主的操作进行实时响应的场景。
分布式:可以轻松应对数据量大,单机搞不定的场景
可扩展:随着业务发展,数据量和计算量越来越大,系统可水平扩展
容错:单个节点挂了不影响应用
消息不丢失:保证消息处理
storm与hadoop的比较:
Storm用于实时计算,Hadoop用于离线计算。
Storm处理的数据保存在内存中,源源不断;Hadoop处理的数据保存在文件系统中,一批一批。
Storm的数据通过网络传输进来;Hadoop的数据保存在磁盘中。

Storm与Hadoop的编程模型相似

3 Storm集群架构

Storm集群采用主从架构方式,主节点是Nimbus,从节点是Supervisor,有关调度相关的信息存储到ZooKeeper集群。

之前文章有些过关于集群下storm的搭建过程,有需要的可以参考下。

Nimbus
Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件(Spout/Bolt)的Task。
Supervisor
Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。通过Storm的配置文件中的supervisor.slots.ports配置项,可以指定在一个Supervisor上最大允许多少个Slot,每个Slot通过端口号来唯一标识,一个端口号对应一个Worker进程(如果该Worker进程被启动)。

Worker

运行具体处理组件逻辑的进程。Worker运行的任务类型只有两种,一种是Spout任务,一种是Bolt任务。

Task

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

ZooKeeper
用来协调Nimbus和Supervisor,如果Supervisor因故障出现问题而无法运行Topology,Nimbus会第一时间感知到,并重新分配Topology到其它可用的Supervisor上运行

4 Storm编程模型(Topologies)

Topology

Storm中运行的一个实时应用程序的名称。将 Spout、 Bolt整合起来的拓扑图。定义了 Spout和 Bolt的结合关系、并发数量、配置等等。

Spouts

消息源spout是Storm里面一个topology里面的消息生产者;
一般来说消息源会从一个外部源读取数据并且向topology里面发出消息:tuple;
Spouts可以是可靠的也可以是不可靠的:如果这个tuple没有被storm成功处理,可靠的消息源spouts可以重新发射一个tuple, 但是不可靠的消息源spouts一旦发出一个tuple就不能重发了;
消息源可以发射多条消息流stream:
使用OutputFieldsDeclarer.declareStream来定义多个stream,
然后使用SpoutOutputCollector来发射指定的stream。

Bolt

接受数据然后执行处理的组件,用户可以在其中执行自己想要的操作

Tuple

一次消息传递的基本单元,理解为一组消息就是一个Tuple

Stream

Tuple的集合。表示数据的流向。

4  Topology运行

在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapReduce任务相似。但是有一点不同的是:在Hadoop中,MapReduce任务最终会执行完成后结束;而在Storm中,Topology任务一旦提交后永远不会结束,除非你显示去停止任务。计算任务Topology是由不同的Spouts和Bolts,通过数据流(Stream)连接起来的图。一个Storm在集群上运行一个Topology时,主要通过以下3个实体来完成Topology的执行工作:

1个worker进程执行的是1个topology的子集(注:不会出现1个worker为多个topology服务)。1个worker进程会启动1个或多个executor线程来执行1个topology的component(spout或bolt)。因此,1个运行中的topology就是由集群中多台物理机上的多个worker进程组成的。
executor是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个component(spout或bolt)的task(注:task可以是1个或多个,storm默认是1个component只生成1个task,executor线程里会在每次循环里顺序调用所有task实例)。

task是最终运行spout或bolt中代码的单元(注:1个task即为spout或bolt的1个实例,executor线程在执行期间会调用该task的nextTuple或execute方法)。topology启动后,1个component(spout或bolt)的task数目是固定不变的,但该component使用的executor线程数可以动态调整(例如:1个executor线程可以执行该component的1个或多个task实例)。这意味着,对于1个component存在这样的条件:#threads<=#tasks(即:线程数小于等于task数目)。默认情况下task的数目等于executor线程数目,即1个executor线程只运行1个task。

总体的Topology处理流程图为:

5 总结

1.拓扑(Topology):打包好的实时应用计算任务,同Hadoop的MapReduce任务相似。
    2.元组(Tuple):是Storm提供的一个轻量级的数据格式,可以用来包装你需要实际处理的数据。
    3.流(Streams):数据流(Stream)是Storm中对数据进行的抽象,它是时间上无界的tuple元组序列(无限的元组序列)。
    4.Spout(喷嘴):Storm中流的来源。Spout从外部数据源,如消息队列中读取元组数据并吐到拓扑里。
    5.Bolts:在拓扑中所有的计算逻辑都是在Bolt中实现的。
    6.任务(Tasks):每个Spout和Bolt会以多个任务(Task)的形式在集群上运行。
    7.组件(Component):是对Bolt和Spout的统称。
    8.流分组(Stream groupings):流分组定义了一个流在一个消费它的Bolt内的多个任务(task)之间如何分组。
    9.可靠性(Reliability):Storm保证了拓扑中Spout产生的每个元组都会被处理。
    10.Workers(工作进程):拓扑以一个或多个Worker进程的方式运行。每个Worker进程是一个物理的Java虚拟机,执行拓扑的一部分任务。

11.Executor(线程):是1个被worker进程启动的单独线程。每个executor只会运行1个topology的1个component。

12.Nimbus:Storm集群的Master节点,负责分发用户代码,指派给具体的Supervisor节点上的Worker节点,去运行Topology对应的组件(Spout/Bolt)的Task。

13.Supervisor:Storm集群的从节点,负责管理运行在Supervisor节点上的每一个Worker进程的启动和终止。

参考: 点击打开链接

storm 原理详解相关推荐

  1. Storm概念、原理详解及其应用(一)BaseStorm

    本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数"wordc ...

  2. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  3. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  4. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  5. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  6. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  7. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

  8. 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解

    前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...

  9. 【Android架构师java原理详解】二;反射原理及动态代理模式

    前言: 本篇为Android架构师java原理专题二:反射原理及动态代理模式 大公司面试都要求我们有扎实的Java语言基础.而很多Android开发朋友这一块并不是很熟练,甚至半路初级底子很薄,这给我 ...

最新文章

  1. IOS7原生API进行二维码条形码的扫描
  2. pip install skimage安装skimage库出错的解决办法
  3. 解决方法:该站点安全证书的吊销信息不可用。是否继续?
  4. Powershell指令集_1
  5. Sam Hartman 当选 Debian 社区领导人
  6. php时间比现实时间慢8个小时,关于PHP获取时间比实际时间少8小时的问题
  7. Android 应用开发(32)--工程相关解析(各种文件,资源访问)
  8. 窗函数(Window Function)在信号处理当中的应用
  9. 数据库 之 Mysql的表分区
  10. vue项目微信公众号title设置和调用接口动态修改
  11. C#生成二维码和条形码并实现打印的功能
  12. 大数据基础知识思维导图
  13. bundle、chunk、module的区别
  14. HTML+CSS篮球静态网页设计(web前端网页制作课作业)NBA杜兰特篮球运动网页
  15. 10.(leaflet之家)leaflet暗色系地图样式地图(滤镜实现,反色滤镜)
  16. 红图新媒体让你知道提升新媒体广告ROI需要关注的10个指标,
  17. 【Win11】重装系统教程
  18. 蓝桥杯每日积累-打破算法壁垒,攻略2n皇后问题
  19. 8岁学编程已经晚了?6个网站让你在家教孩子学编程
  20. Java 按页拆分pdf

热门文章

  1. 安防运营服务市场现状及所遇问题的解决
  2. WIN10 1809隐藏大杀器--卓越模式
  3. 连接数据孤岛,巨杉数据库与 Tapdata 联合共建开放数据生态
  4. 2018,愿岁月可回首
  5. 基于FPGA的AM信号的调制与解调
  6. [物联网IoT]万物互联开启智慧新图景 下一代互联网未来已来
  7. Linux 角度看binder原理(四
  8. Nettools命令使用和输出信息分析
  9. 阿里云盘对比百度云盘目前硬件调度上最大弱点
  10. Java+spring 基于ssm的家用电器销售商城网站的设计与实现#毕业设计