[译]【Storm 入门指南】第一章 基础

最近需要使用Storm,看了一些英文资料。觉得 O’Reilly 的 Getting started with Storm 比较浅显易懂,适合作为入门资料。特翻译之,以飨众生。

特别注明:本文翻译自 Getting started with Storm 第一章,以作学习交流之用,非盈利性质。如需转载,请以超链接形式标明文章原始出处和作者信息及版权声明。

Storm 是一个可靠的、容错的分布式数据流处理系统。它将工作委派给不同类型的组件,这些组件各自负责某个简单特定的处理任务。Storm 集群的输入流由组件spout负责。spout将数据传送至bolt,进而完成某种形式的转换。bolt 可采用某种存储形式对数据进行持久化,或者将数据传送至其它 bolt。 你可以将 Storm 集群想象成一个bolt链,每个bolt负责对从spout流入的数据进行某种形式的处理。

现在举例来说明这个概念。昨晚,我观看了一个新闻节目,节目中发言人不停地谈论政治家和他们在不同领域的位置。他们提到了许多不同的名字,我想知道是否每个名字都被同等次数地被提及,还是某几个名字被反复提及。

将发言的副标题当作数据的输入流,使用一个spout从文件中读取该内容(通过socket、HTTP或者其他途径);当文本到达时,spout将它们传送到负责分词的bolt;之后每个单词被传送到另一个bolt,在该bolt中将单词与预先定义好的政治家名单进行比对,如果匹配,将数据库中的对应名字的计数递增。无论何时你想查看结果,从数据库中查询即可。且随着数据源源不断地过来,结果是实时更新的。所有的组件(spoutbolt)和连接所组成的结构被称为拓扑(topology)[见图1.1]。

图1.1

现在可以很容易地想象将每个boltspout的并行水平拓展到整个集群,这样可以无限扩展拓扑。很神奇,对吧!即使透过这个简单的例子,你也可以洞悉Strom的强大力量。

那么,Storm 适合什么样的场景?

  • 流数据处理
    :正如上述例子所展示的,Storm 不像其他流处理系统,它不需要任何内部队列。
  • 持续计算
    :持续地向客户端发送数据,它们能够实时更新和展示结果,比如网站指标。
  • 分布式远程方法调用
    :轻松地并发执行CPU密集型操作。

1.1 Storm 组件

在Storm集群中,节点被组织到持续运行的管理节点中。集群中有两类节点:管理节点和工作节点。管理节点运行一个称为 Nimbus 的守护进程,以此来响应集群中分散的节点、给工作节点分配任务并监控失败。工作节点运行一个称为 Supervisor 的守护进程来执行拓扑中的一部分功能。一个 Storm 拓扑运行在不同的机器上的工作节点。

由于Storm将集群的状态保存在 Zookeeper 或本地磁盘中,因此守护进程是无状态的,可以在不损害系统健康的同时失败或重启[见图1.2]。

图1.2

Storm的底层采用 zeromq(Omq, zeromq)—— 一个先进的嵌入式网络通讯库,为Storm提供了很多令人激动的功能。以下列出了 zeromq 的特点:

  • 支持高并发的网络通讯库
  • 比TCP更快,适用于大型生产集群和超级计算
  • 采用进程内通信、进程间通信、TCP和多播传递消息
  • 异步I/O,适用于扩展的多核消息传递应用中
  • 通过扇出、发布订阅、管道、请求-应答实现多对多连接

Storm 使用了推/拉(push/pull)套接字

1.2 Storm特性

所有的设计概念和决策,最终使得 Storm 独一无二,拥有几个非常美好的特性。

  • 编程模型简单
    :如果你曾尝试过进行实时处理,就知道编码起来有多痛苦,但是 Storm 却显著降低了这种复杂度。

  • 支持多种编程语言
    :除了可以使用基于JVM的语言,你还可以使用任何你熟悉的编程语言。

  • 容错性
    :Storm 集群能够合理处理工作节点的各种突发状况,如减少节点、重新分配任务等。

  • 可扩展
    :为了能够扩展,你需要做的仅是往集群中增加更多机器,Storm 会自行往可用的新增机器上分配任务。

  • 可靠性
    :可以保证所有消息至少被处理一次。如果出错了,消息可能会被处理多次,但从不会丢失消息。

  • 高效
    :速度是设计 Storm 的一个重要标准。

  • 事务性
    :你可以得到几乎任何一次计算的消息语义。