一、storm是一个用于实时流式计算的分布式计算引擎,弥补了Hadoop在实时计算方面的不足(Hadoop在本质上是一个批处理系统)。

二、storm在实际应用场景中的位置一般如下:

其中的编号1~5说明如下:

1、Flume用于收集日志信息;

2、结合数据传输功能可以把收集到的日志信息实时传输到kafka集群,或保存到Hadoop hdfs中保存。

这里之所以选择kafka集群是因为kafka集群具备缓冲功能,可以防止数据采集速度和数据处理速度不匹配导致数据丢失,这样做可以提高可靠性。

3、使用storm实时处理数据;

4、保存storm处理的结果数据,当数据量不是特别巨大时,可以使用MySQL存储;当数据量特别巨大时,可以选择hdfs存储。

5、用于实时展示处理结果。

三、storm的抽象运行方式:

其中:

spout为数据流的源头;

tuple为流动中的数据承载单元;

Bolt为数据流处理的中间状态。

四、spout和Bolt如何形成程序运行?

storm中运行的程序称为Topology,Topology将spout和bolt组装在一起,完成实时计算的任务。具体操作是通过TopologyBuilder的setSpout方法和setBolt方法,例子如下:

  1. TopologyBuilder builder = new TopologyBuilder();
  2. builder.setSpout("spout-name", your-spout-program);
  3. builder.setBolt("bolt-name-one", your-bolt-program-one, thread-number)
  4. .fieldsGrouping("spout-name", new Fields("field-key-name-one"));
  5. builder.setBolt("bolt-name-two", your-bolt-program-two).fieldsGrouping("bolt-name-one", new Fields("field-key-name-two"));
  6. Config conf = new Config();
  7. StormSubmitter.submitTopology("your-Topology-name", conf,builder.createTopology());

五、如何决定数据流的流向:

(1)借助在TopologyBuilder的setSpout方法和setBolt方法的第一个参数中为Spout程序和Bolt程序取的名字,例如上面示例代码中的“spout-name”以及“bolt-name-one”,“bolt-name-two”。

补充:setBolt方法原型:

  1. setBolt(String id, IBasicBolt bolt, Number parallelism_hint)
  2. Define a new bolt in this topology.

setSpout方法原型:

  1. setSpout(String id, IRichSpout spout, Number parallelism_hint)
  2. Define a new spout in this topology with the specified parallelism.

(2)setBolt方法返回的BoltDeclarer对象利用fieldGrouping方法并结合(1)中的spout和bolt名字指定数据流的流向。
补充:fieldGrouping方法原型:

  1. T fieldsGrouping(String componentId,
  2. Fields fields)
  3. The stream is partitioned by the fields specified in the grouping.
  4. Parameters:
  5. componentId -
  6. fields -
  7. Returns:

六、数据流中的数据承载单元tuple结构是什么

官网文档如下:

The tuple is the main data structure in Storm. A tuple is a named list of values, where each value can be any type. Tuples are dynamically typed -- the types of the fields do not need to be declared. Tuples have helper methods like getInteger and getString to get field values without having to cast the result. Storm needs to know how to serialize all the values in a tuple. By default, Storm knows how to serialize the primitive types, strings, and byte arrays. If you want to use another type, you'll need to implement and register a serializer for that type. See http://github.com/nathanmarz/storm/wiki/Serializationfor more info.

通俗的讲,tuple就是一个值列表,其中的值类型可以是任何类型,默认类型有byte,integer,short,long,float,double,string,byte[]。

tuple数据结构如下:

其中,fieldName是定义在declareOutputFields方法中的Fields对象,fieldValue值是在emit方法中发送的Values对象。

tuple都是通过spout和bolt发射(传送)的。

例如:

spout程序如下:

  1. public class ParallelFileSpout extends BaseRichSpout{
  2. @SuppressWarnings("rawtypes")
  3. public void open(Map conf, TopologyContext context,
  4. SpoutOutputCollector collector) {
  5. }
  6. /**
  7. * called in SpoutTracker. called once, send a single tuple.
  8. */
  9. public void nextTuple() {
  10. //不断获取数据并发射
  11. collector.emit(new Values("your-sent-fieldValue"));
  12. }
  13. /**
  14. * define field. used for grouping by field.
  15. */
  16. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  17. declarer.declare(new Fields("your-sent-fieldName"));
  18. }
  19. }

bolt程序如下:

  1. public class DetectionBolt extends BaseBasicBolt {
  2. public void prepare(Map stormConf, TopologyContext context) {
  3. }
  4. public void execute(Tuple input, BasicOutputCollector collector) {
  5. //不断的处理数据后发射
  6. collector.emit(new Values(“your-sent-fieldValue”));
  7. }
  8. public void declareOutputFields(OutputFieldsDeclarer declarer) {
  9. declarer.declare(new Fields("your-sent-fieldName"));
  10. }
  11. }

七、spout如何发射无界的数据流,bolt如何处理接收到的数据tuple

(1)如在上一部分spout的示例代码,其中必含有nextTuple方法,在spout程序生命周期中,nextTuple方法一直运行,所以可以一直获取数据流中的数据并持续像bolt处理程序发射。

(2)如在上一部分bolt的示例代码,其中必含有execute方法,在bolt程序生命周期中,只要其收到tuple数据就会处理,根据需要会把处理后的数据继续发射出去。

八、如何保证所有发射的数据tuple都被正确处理

同一个tuple不管是处理成功还是失败,都由创建它的Spout发射并维护。

九、storm和Hadoop中各角色对比

十、storm比Hadoop实时是因为Hadoop在把一批数据都处理完毕后才输出处理结果,而storm是处理一点数据就实时输出这些数据的处理结果。

Storm与传统关系型数据库 
    传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存 
    传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据 
    关系型数据库重视事务,并发控制,相对来说Storm比较简陋 
    Storm不Hadoop,Spark等是流行的大数据方案

与Storm关系密切的语言:核心代码用clojure书写,实用程序用python开发,使用java开发拓扑

topology

Storm集群中有两种节点,一种是控制节点(Nimbus节点),另一种是工作节点(Supervisor节点)。所有Topology任务的 提交必须在Storm客户端节点上进行(需要配置 storm.yaml文件),由Nimbus节点分配给其他Supervisor节点进行处理。 Nimbus节点首先将提交的Topology进行分片,分成一个个的Task,并将Task和Supervisor相关的信息提交到 zookeeper集群上,Supervisor会去zookeeper集群上认领自己的Task,通知自己的Worker进程进行Task的处理。

和同样是计算框架的MapReduce相比,MapReduce集群上运行的是Job,而Storm集群上运行的是Topology。但是Job在运行结束之后会自行结束,Topology却只能被手动的kill掉,否则会一直运行下去

Storm不处理计算结果的保存,这是应用代码需要负责的事情,如果数据不大,你可以简单地保存在内存里,也可以每次都更新数据库,也可以采用NoSQL存储。这部分事情完全交给用户。

数据存储之后的展现,也是你需要自己处理的,storm UI 只提供对topology的监控和统计。

Storm概念讲解,工作原理的更多相关文章

  1. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  2. LVM基本概念及工作原理

    LVM基本概念及工作原理 背景知识: 一直困惑于LVM,特地找资料查了查,终于对LVM的概念和工作原理有了深入的理解.接下来记录下.新的技术出来必定是为了改变现有的不足,所以LVM的出现是由于对现有磁 ...

  3. zabbix监控的基础概念、工作原理及架构(一)

    zabbix监控的基础概念.工作原理及架构 转载于网络 一.什么是zabbix及优缺点 Zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的 ...

  4. Elasticsearch系列---Elasticsearch的基本概念及工作原理

    基本概念 Elasticsearch有几个核心的概念,花几分钟时间了解一下,有助于后面章节的学习. NRT Near Realtime,近实时,有两个层面的含义,一是从写入一条数据到这条数据可以被搜索 ...

  5. SaltStack 的基本概念与工作原理 架构设计

    随着云计算技术的快速普及与发展,越来越多的企业开始学习和搭建自己的云平台代替传统的 IT 交付模式,企业的 IT 环境也随之越来越复杂,常规的运维方法与技术已经无法满足现在云环境中系统的配置与变更.基 ...

  6. zabbix监控的基础概念、工作原理及架构

    一.什么是zabbix及优缺点(对比cacti和nagios) Zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题.是一个基于WE ...

  7. NAT、NAPT(PAT)的基本概念和工作原理及区别

    转自:http://blog.sina.com.cn/s/blog_5d302bd20100gprv.html 近年来,随着 Internet 的迅猛发展,连入 Internet 的主机数量成倍增长. ...

  8. VRRP概念、工作原理

    VRRP是一种路由容错协议,也可以叫做备份路由协议,可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台. 控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器, 它负责转发 ...

  9. Storm概念讲解和工作原理介绍

    Strom的结构 Storm与传统关系型数据库     传统关系型数据库是先存后计算,而storm则是先算后存,甚至不存     传统关系型数据库很难部署实时计算,只能部署定时任务统计分析窗口数据   ...

随机推荐

  1. 第十五篇:C程序的存储空间布局

    前言 C语言程序的执行必定需要耗费一定的资源,也就是说,程序在计算机内部的映像不可能就单单代码. 本文将讲解C语言程序在计算机内部的存在方式. 程序存储空间 1. 正文段:程序的机器指令部分 2. 初 ...

  2. 第五篇:CUDA 并行程序中的同步

    前言 在并发,多线程环境下,同步是一个很重要的环节.同步即是指进程/线程之间的执行顺序约定. 本文将介绍如何通过共享内存机制实现块内多线程之间的同步. 至于块之间的同步,需要使用到 global me ...

  3. STM32 PWM的输出与Keil软件仿真

    导读:PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值). PWM控制技术在逆变电路中应用最广,应用 ...

  4. 那个你经常用的abs函数(取绝对值)真的总是返回非负数吗?

    前几天在牛客网看到一道关于abs()函数返回值的题目,见下图,当时还没反应过来,第一反应是:自从我开始学C语言,就知道它是用来求int数的绝对值的,返回值当然是0或者正数啊,一看答案就是A. 后来思来 ...

  5. js 实现table表格拖拽和点击表头升降序排序

    js 实现table表格拖拽和点击表头升降序排序,写的比较乱,用的时候可以把其中的一些模块函数提取出来 样式,由于是可拖拽表格,所以样式 table tr th{cursor:move;} js实现 ...

  6. Golang开发支持平滑升级(优雅重启)的HTTP服务

    Golang开发支持平滑升级(优雅重启)的HTTP服务 - tabalt的博客 http://tabalt.net/blog/graceful-http-server-for-golang/ http ...

  7. $obj->0

    w对象 数组 分别对内存的 消耗 CI result() This method returns the query result as an array of objects, or an empt ...

  8. Yii框架2.0的安装过程

    Yii框架是个不错的php开发框架,大型项目上都可以使用.和大多框架一样他也是开源,而且采用了mvc结构的. Yii1.*,直接下载然后用脚步可以创建自己的项目了,最近看了下Yii2.0版本的,他推荐 ...

  9. LeetCode_Add Two Numbers

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  10. jquery插件开发快速入门

    1.添加jQuery对象方法添加jQuery对象方法:jQuery.prototype.myMethod. 在jQuery源码中有一句:jQuery.fn = jQuery.prototype,也就是 ...