Getting Started with Storm
数据是值钱的,可是在很多商业场景中,随着时间的流逝,数据的价值是下降的。因此实时处理数据的方式方法能力也就很关键。在开源的领域,有个叫Storm的东西是做流数据处理的。中英文资料都很少,好不容易看到了一本Getting
Started with Storm,很薄,105页,准备一边读读,一边弄成中文的。只能算是个人的读书心得和笔记。
第一章
基础
Storm是一个用来处理数据流的分布式,可靠且能容错的系统。由各种被指定完成最基础简单任务的组件构成。Storm集群的输入流由Spout组件来处理,然后Spout把数据传递给Bolt组件,可以通过Bolt组件来处理数据。而一个Bolt可以将数据存放在某些存储设备中实现数据的持久化或者把数据传递给其他Bolt。你可以把Storm集群想象为Bolt的链条,每个环节都对数据进行一定的处理,而这条链条的输入数据都来自于Spout。
为了阐明这个概念,这里有个简单的例子。昨天晚上我在看新闻的时候正好播音员开始说道政治家及他们对于各种话题的态度。播音员总是说到不同的名字,我对每个名字被提到的频率产生了兴趣,想知道这些名字是被提到同样多的次数,还是说有特殊的倾向性。
设想我们把播音员正在说的话的字幕作为数据的输入流。于是我们可以通过一个Spout把这些信息从一个文件或者是Socket,通过HTTP或者其他方式读入。每接收到一行文本,Spout就把他们传递给一个专门用来把每行文本切分成单词组的Bolt来处理。然后这组单词的数据流被传递给另外一个专门用来比较的Bolt,比如我们可以把每个词都和事先定义好的政治家的名单做比较。每当有一个匹配的名字,第二个Bolt就把对应的名字在数据库中的计数器加1.于是无论什么时候你想看到结果,你只需要查询数据库,这个数据库是实时更新的。这样的所有组件的安置以及他们的联系被叫做Topology,下面是个例子:
现在我们再来设想一下,我们在一个Storm中对于每一个Bolt和Spout都做并行扩展,于是我们就得到了一个可以无限扩展的Topology。是不是很神奇?尽管这是一个简单的例子,但是你却可以看到Storm的强大。
Storm的典型场景有哪些呢?
流处理
正如在上面的例子中展示的,不像其他一些流处理系统,Storm没有必要设置流处理的中间队列持续计算
持续不断地将数据发送到客户端,从而保证这些数据可以被实时更新和展示分布式远程处理
非常简单地把CPU密集型操作并行化Storm的组件
在一个Storm集群,节点被组成可以持续运行的Master节点。现在存在2中类型的节点:master节点 和
worker节点。Master节点运行一个叫做Nimbus的守护进程,负责在整个集群中的代码分发,对于每个work节点的任务分配,监控各种运行失败。Worker节点运行一行一个叫做Supervisor的守护进程,是一个Topology的一个执行部分。在Storm中,Topology可以在各种不同的机器上运行多个Worker节点。因为Storm将所有集群的状态记录在Zookeeper或者本地硬盘中,而守护进程是无状态的,可以失败或者重启而不会影响整个系统的健康。
在底层,Storm使用了zeromq或者0mq这样一个高级的,可嵌入的网络库,也正是0mq提供的各种精彩的特性使Storm成为可能。我们列一下0mq的特性:
- Socket库支持并发的框架
- 对于集群和超级计算而言,速度比TCP快
- 通过inproc(进程内),IPC(进程间),TCP和multicast(多点传送)传递信息
- 支持可扩展多核信息传送应用的异步I/O
- 通过Fanout(扇出),pubsub(发布/订阅),pipeline(管道),request-reply(需求/响应)方式支持N-to-N链接
Storm的特点
在所有的设计原则中,下面这些是尤其要注意的,正是这些使Storm非常出众:
易于编程:如果你曾经试过使用Scratch来做实时处理,你就能体会到这有多痛苦。而Storm可以显著地降低其复杂度。
支持多种编程语言:用基于JVM的语言来做Storm的开发是非常容易的,同时Storm也支持通过其他中间库的支持来支持任何一种你熟悉的编程语言。
容错:Storm集群会自动监控所有的worker节点,如果需要会自动重新安排任务
可扩展:在你需要扩展的时候,你唯一要做的工作就是往集群中增加额外的机器。Storm会自动为这些新增加的机器安排任务。
可靠:所有的信息会保证至少被执行一次,如果出错了,就会被执行多次,但是你不用担心会丢失任何信息
快速:Strom在设计的时候就考虑了速度的因素
支持事务:对于任意多计算,你可以精确地得到一个消息传递语义