翻译自:Getting Started With Storm (作者:Jonathan Leibiusky, Gabriel Eisbruch and Dario Simonassi)
由于本人英文水平和理解有限,翻译难免错误,还望大家多多指正,请联系storm_getstarted@126.com
欢迎大家留言跟帖或邮件至storm_getstarted@126.com,共同学习Storm
Storm是分布式、可靠的、具有容错性的流数据处理系统。它将任务委派给各种负责简单特定任务处理的组件。Storm集群的输入流被一个称作spout的组件进行处理,spout组件将数据以某种方式传给bolt组件。Bolt要么存储数据,要么将它传给其它的bolt。你可以设想storm集群是由许多bolt组件组成的链式处理结构,每个bolt对spout发射出的数据进行各种转换操作。
为了解释这个概念,这里有一个简单例子。昨晚我看新闻,主持人开始播报政客和他的对手在不同主题上的政见。他们持续重复着不同的姓名,我想知道是否每个姓名提到了相同的次数,或者在提到的数目上存在偏见。
设想将主持人正在说到的副标题作为流数据的输入,你应该有一个spout从文件(socket连接、HTTP、或其它方式)读入数据。当文字一行行流入时,spout将它们传给第一个bolt,它会将它们拆分成一个个单词。单词流传给另一个预存了政客姓名的链表的bolt,它会比较每个单词与链表中姓名。当匹配时,第二个bolt将在数据库中的该姓名的计数加1。任何时候只要你想知道结果,你只要对数据库进行查询,它会随着数据的实时输入而不断更新。所有组件(包括spouts和bolts)的排列和通信被称作topology(如图1-1所示)。
图1-1 一个简单的topology
现在设想简单地为每个bolt和spout在跨整个集群中定义并行级别,以便你可以无限地扩展你的topology 。是不是很令人吃惊?尽管这个一个简单示例,但你可以看出Storm的威力。
Storm的典型实例案例有哪些?
流处理
如之前示例所解释的,与其它流处理系统不同,Storm无需中间队列。
持续计算
持续地向客户发送数据,如站点度量,以使他们能够实时更新和显示结果。
分布式远程过程调用
简单并行的CPU密集型操作。
Storm组件
在一个Storm集群中,所有节点在主节点的组织下持续运行。
在Storm集群中,存在两种不同的节点:主节点和工作节点。主节点运行着Nimbus后台进程,它负责在集群中分发代码,分配任务给每个工作节点,同时监控失败。工作节点运行着Supervisor的后台进程,它负责执行topology的一部分。Storm中的一个topology由跨不同的机器的多个工作节点运行着。
因Storm维护着所有集群状态在Zookeeper中或本地磁盘中,进程是无状态的,在失败或重启时不会影响系统的正常运行(如图1-2)。
图1-2 Storm集群组件
在底层,Storm使用到了zeromq(0mq)的一些非常精彩的特性。zeromq是一个高级的,可嵌入式的网络库。下面列举一些zeromq的特征。
l 虽然是一个Socket库,但却更像是一个并发开发框架
l 对并发项目与超级计算来讲,比TCP协议要快
l 提供进程内、进程间、机器间和广播方式的消息通讯。
l 对可扩展的多核消息传递应用程序提供异步I/O支持。
l 在多对多的网络环境中提供多对一,发布/订阅(one-to-many),管道(one-to-one),请求/响应等模型。
Storm仅使用推/拉sockets。
Storm特点
在这些设计概念和章节中,Storm拥有一些非常优秀的特点,使得Storm非常独特。
编程简单
如果你已经尝试从头开始做实时处理,你将非常清楚地体会到那是多么痛苦。有了Storm,复杂性将被神奇地降低了。
多编程语言支持
它不仅在基于Java虚拟机的语言上非常容易开发,Storm还支持任意的语言,只要你使用或实现一个小的中间库。
容错性
Storm集群关注机器的实效,当需要时会重新分配任务。
可扩展性
为了扩展,你需要做的只是加入更多的机器到集群中。Storm将在它们变得可用时将任务重分配给新的机器。
可靠性
所有的消息均保证至少被处理一次。如果出错,消息可能会被处理超过一次,但你不会漏掉任何消息。
快速
速度是驱动Storm设计的一个关键因素
Transactional
You can get exactly once messaging semantics for pretty much anycomputation.
【参考翻译】
事务
你可以通过几乎任何的计算获得准确的消息语义。