注:括号里的字,并且是(灰色)的,是我个人的理解,如有差错,欢迎交流

Storm是一个分布式的、可靠的、容错的数据流处理系统(流式计算框架,可以和mapreduce的离线计算框架对比理解)。整个任务被委派给不同的组件,每个组件负责一个简单的特定的处理任务。Storm集群的输入流是一个叫spout的组件负责接入处理。spout把数据传给bolt组件,bolt组件可以对数据完成某种转化。bolt组件可以把数据持久化,或者传送到其他的bolt。可以把Storm集群想象成一个bolt组件链,每个组件负责对spout流入的数据(也可以是其他bolt流入的数据)进行某种形式的处理。

有个简单的例子可以说明这个概念。昨晚我看新闻,节目中发言人在谈论政治家以及他们在不用领域的立场。他们不停地在重复一些不同的名字,这时我想知道他们提到的每个名字出现的次数是否一样,还是在某些名字被提及次数更多。

把发言人的言语想象成数据的输入流。我们可以定义一个spout从文件(通过socket、HTTP或者其他方式)读取这些输入。当几行文本到来时,spout把它们传送给bolt,bolt负责把文本分词。接着数据流被传送到另外一个bolt,这个bolt负责在一个已经定义好的政治家名单进行比对。如果匹配到了,将数据库中对应的名字的计数加1。任何时候你想看结果,只要从数据库中查询就可以,因为当数据到达时整个过程都是实时更新的。这过程中所有的组件(spout和bolt)以及他们之间的连接被称为拓扑(topology)(见图表 1-1)。

现在很容易想象定义每个bolt和spout并行度,这样可以无限地扩展整个拓扑。很神奇,对吧?尽管前面讲的只是一个简单的例子,不过你大概已经隐约感觉到Storm的强大了。

那么,Storm适用什么应用场景呢?

  • 数据流处理:正如上述的例子,Storm不像其他流处理系统,因为Storm不需要中间队列。
  • 持续计算:持续地向客户端发送数据,它们可以实时的更新以及展现数据,比如网站指标。
  • 分布式远程过程调用:轻松地并行化CPU密集型操作。

(补充)从业务场景上,举例说明Storm的可以处理的具体业务(这部分是黄崇远总结的,觉得比较全面,摘抄在此)

  • 条件过滤:这是Storm最基本的处理方式,对符合条件的数据进行实时过滤,将符合条件的数据保存下来,这种实时查询的业务需求再实际应用中很常见。
  • 中间计算:我们需要改变数据中某一个字段(例如是数值),我们需要利用一个中间值经过计算(值比较、求和、求平均等等)后改变该值,然后将数据重新输出。
  • 求TopN:相信大家对TopN类的业务需求也比较熟悉,在规定时间窗口内,统计数据出现的TopN,该类处理在购物及电商业务需求中,比较常见。
  • 推荐系统:有时候在实时处理时会从mysql及hadoop中获取数据库中的信息,例如在电影推荐系统中,传入数据为:用户当前点播电影信息,从数据库中获取的是该用户之前的一些点播电影信息统计,例如点播最多的电影类型、最近点播的电影类型,及其社交关系中点播信息,结合本次点击及从数据库中获取的信息,生成推荐数据,推荐给该用户。并且该次点击记录将会更新其数据库中的参考信息,这样就是实现了简单的智能推荐。
  • 分布式RPC:Storm有对RPC进行专门的设计,分布式RPC用于对Storm上大量的函数进行并行计算,最后将结果返回给客户端。
  • 批处理:所谓批处理就是数据积攒到一定触发条件,就批量输出,所谓的触发条件类似事件窗口到了,统计数量够了即检测到某种数据传入等等。
  • 热度统计:热度统计实现依赖于Storm提供的TimeCacheMap数据结构,现在可能推荐用RotatingMap,关于这两个数据结构的源码分析,移步Storm TimeCacheMap RotatingMap源码分析,该结构能够在内存中保存近期活跃的对象。我们可以使用它来实现例如论坛中热帖排行计算等。

Storm组件

在Storm集群中,节点被一个主控节点管理,并持续运行。

在Storm集群中有两类节点:主控节点和工作节点。主控节点跑一个后台进程Nimbus,它负责在集群中分发代码,把任务安排给工作节点,监控任务是否失败。工作节点跑后台进程叫Supervisor来执行拓扑的部分功能。Storm的拓扑会在不同机器的工作节点上运行。

因为Storm把集群的状态存在Zookeeper或者本地磁盘,所以后台进程都是无状态的(不需要保存自己的状态,都在zookeeper上),可以在不影响系统健康运行的同时失败或重启。(见图1-2)

在底层Storm使用了zeromq(0mq,zeromq(http://www.zeromq.org)),一个先进的嵌入式的网络通讯库,提供了很棒的功能使得Storm成为可能。以下是zeromq的特点:

  • 支持高并发框架的Socket库
  • 比TCP更快,适用于集群产品和超级计算
  • 通过进程内通信,进程间通信,TCP和多播的形式传递消息
  • 异步的I/O,服务于可扩展的多核消息传输应用
  • 通过扇出(fanout),发布订阅,管道,请求应答实现多对多连接

Storm用了push/pull套接字api

(补充:Storm组件的命名方式)

Storm暴风雨:其组件大多也以气象名词命名

spout龙卷:形象的理解是把原始数据卷进Storm流式计算中

bolt雷电:从spout或者其他bolt中接收数据进行处理或者输出

nimbus雨云:主控节点,存在单点问题,不过可以用watchdog来保证其可用性,fast-fail后马上就启动

topology拓扑:Storm的任务单元,形象的理解拓扑的点是spout或者bolt,之间的数据流是线,整个构成一个拓扑

Storm的特性

所有的设计概念和决策,使得Storm拥有诸多美好的特性,Storm变得独一无二。

  • 编程简单:如果你曾经尝试实时处理抓取的内容,就知道这个过程有多痛苦。但是Storm显著的降低了编码复杂度。
  • 支持多种编程语言:用基于JVM的语言会比较简单,但是Storm也支持任意其他语言,只要使用或者实现一个很小的中间件。(第七章有一个php的例子)
  • 容错性:Storm可以处理工作节点的宕机,在适当的时候重新安排任务。
  • 可扩展性:为了扩展,你需要做的就是往集群里加更多的机器。Storm会往可用的新机器上分配任务。
  • 可靠性:所有的消息保证至少都能处理一次。如果发生错误,这些消息会被处理多次,但从不会丢失数据。
  • 高效:速度是驱动Storm设计的一个重要指标。
  • 事务性:对于绝大部分运算来说,你可以得到消息一次消费的语义。

《Getting started with Storm》译文HomePage 译文索引

《Getting Started with Storm》章节一 基础的更多相关文章

  1. 章节1-Prometheus基础(1)

    目录 一.Prometheus安装部署 1. 简介 监控的目的 Prometheus的优势 2. Prometheus工作流程: 2.1 服务端 2.2 客户端 2.3 metrics主要数据类型 3 ...

  2. C#基础--之数据类型

    C#基础--之数据类型 摘自:http://www.cnblogs.com/tonney/archive/2011/03/18/1987577.html 在第一章我们了解了C#的输入.输出语句后,我这 ...

  3. 【原】Storm序列化

    5. Storm高级篇 序列化 Dynamic typing Custom serialization Java serialization Component-specific serializat ...

  4. C#基础(二)--之数据类型

    在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...

  5. 【RL-TCPnet网络教程】第5章 PHY芯片和STM32的MAC基础知识

    第5章        PHY芯片和STM32的MAC基础知识 本章节为大家讲解STM32自带的MAC和PHY芯片的基础知识,为下一章底层驱动的讲解做一个铺垫. 5.1   初学者重要提示 5.2    ...

  6. Mysql增量写入Hdfs(二) --Storm+hdfs的流式处理

    一. 概述 上一篇我们介绍了如何将数据从mysql抛到kafka,这次我们就专注于利用storm将数据写入到hdfs的过程,由于storm写入hdfs的可定制东西有些多,我们先不从kafka读取,而先 ...

  7. day18-19 Storm

    课程介绍 课程名称:Storm是什么 课程目标: 通过该课程的学习能够了解离线计算与流式计算的区别.掌握Storm框架的基础知识.了解流式计算的一般架构图. 课程大纲: 1. 离线计算是什么? 2.  ...

  8. day6-面向对象基础篇

    一.面向对象引子及概念 结合编程的一些理论知识和实践,可以总结出目前存在以下编程模式: 1. 面向过程 按照业务逻辑和实现过程步骤来逐步垒代码,代码编写的逻辑即对应于实际实现的步骤过程,核心是过程两个 ...

  9. 基础篇:3.4)3d模型绘制的好坏会影响产品合格率(注意点)

    本章目的:为了量产品的产能与合格率,重视3d图纸. 1.前言 作者希望本文能引起重视,是那些刚入行业的菜鸟: 还有只用2d图纸,便能绘制出能量产合格品的前辈大牛工程师. 2.3d图纸不合格的现状及典型 ...

随机推荐

  1. openURL的使用方法:

    openURL的使用方法: view plaincopy toclipboardprint?        [[UIApplication sharedApplication] openURL:[NS ...

  2. 查看局域网内在线的主机ip和mac地址

    ]# nmap -sP Starting Nmap 5.51 ( http://nmap.org ) at 2016-12-12 22:43 CST Nmap scan report for 192. ...

  3. Linux系统监控命令及如何定位到Java线程

    >>PID.TID的区分 uid是user id,即用户id,root用户的uid是0,0为最高权限,gid是group id,用户组id,使用 id 命令可以很简单的通过用户名查看UID ...

  4. JavaScript Canvas 根据像素点取位置

    <html> <body> <canvas id="canvas" width="100" height="100&qu ...

  5. 从 Eclipse 迁移至 Android Studio

    从 Eclipse 迁移至 Android Studio 本文内容 Android Studio 基础知识 迁移先决条件 将项目导入 Android Studio 后续步骤 将项目迁移至 Androi ...

  6. Delphi线程同步(临界区、互斥、信号量)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  7. 【网络资料】如何优雅地使用Sublime Text3

    如何优雅地使用Sublime Text3 Sublime Text:一款具有代码高亮.语法提示.自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,用她来写代码,绝对是一种享受.相 ...

  8. 自制工具:迅速打开一个Node 环境的Playground

    需求 经常有这种情况,写代码的时候需要实验种想法,亟需一种playground 环境来玩耍.如果是前端的话可以打开chrome 的控制台,但是如果是Node 的话就比较麻烦了.我要打开我的存放试验代码 ...

  9. 攻城狮在路上(叁)Linux(十四)--- 查阅文件内容

    常用命令:cat.tac.nl.more.less.head.tail.od... 一.直接查看文件内容:cat.tac.nl <==一次性全部读取 1.cat [-AbEnTv] 文件名 参数 ...

  10. 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等

    一.hibernate访问持久化类属性的策略: 在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式. 常见的方式如下: 1.property:默 ...