最近需要使用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
中将单词与预先定义好的政治家名单进行比对,如果匹配,将数据库中的对应名字的计数递增。无论何时你想查看结果,从数据库中查询即可。且随着数据源源不断地过来,结果是实时更新的。所有的组件(spout
和bolt
)和连接所组成的结构被称为拓扑(topology)[见图1.1]。
现在可以很容易地想象将每个bolt
和spout
的并行水平拓展到整个集群,这样可以无限扩展拓扑。很神奇,对吧!即使透过这个简单的例子,你也可以洞悉Strom的强大力量。
那么,Storm 适合什么样的场景?
- 流数据处理
:正如上述例子所展示的,Storm 不像其他流处理系统,它不需要任何内部队列。 - 持续计算
:持续地向客户端发送数据,它们能够实时更新和展示结果,比如网站指标。 - 分布式远程方法调用
:轻松地并发执行CPU密集型操作。
1.1 Storm 组件
在Storm集群中,节点被组织到持续运行的管理节点中。集群中有两类节点:管理节点和工作节点。管理节点运行一个称为 Nimbus
的守护进程,以此来响应集群中分散的节点、给工作节点分配任务并监控失败。工作节点运行一个称为 Supervisor
的守护进程来执行拓扑中的一部分功能。一个 Storm 拓扑运行在不同的机器上的工作节点。
由于Storm将集群的状态保存在 Zookeeper 或本地磁盘中,因此守护进程是无状态的,可以在不损害系统健康的同时失败或重启[见图1.2]。
Storm的底层采用 zeromq(Omq, zeromq)—— 一个先进的嵌入式网络通讯库,为Storm提供了很多令人激动的功能。以下列出了 zeromq 的特点:
- 支持高并发的网络通讯库
- 比TCP更快,适用于大型生产集群和超级计算
- 采用进程内通信、进程间通信、TCP和多播传递消息
- 异步I/O,适用于扩展的多核消息传递应用中
- 通过扇出、发布订阅、管道、请求-应答实现多对多连接
Storm 使用了推/拉(push/pull)套接字
1.2 Storm特性
所有的设计概念和决策,最终使得 Storm 独一无二,拥有几个非常美好的特性。
编程模型简单
:如果你曾尝试过进行实时处理,就知道编码起来有多痛苦,但是 Storm 却显著降低了这种复杂度。支持多种编程语言
:除了可以使用基于JVM的语言,你还可以使用任何你熟悉的编程语言。容错性
:Storm 集群能够合理处理工作节点的各种突发状况,如减少节点、重新分配任务等。可扩展
:为了能够扩展,你需要做的仅是往集群中增加更多机器,Storm 会自行往可用的新增机器上分配任务。可靠性
:可以保证所有消息至少被处理一次。如果出错了,消息可能会被处理多次,但从不会丢失消息。高效
:速度是设计 Storm 的一个重要标准。事务性
:你可以得到几乎任何一次计算的消息语义。