Storm 是Twitter的一个开源框架。Storm一个分布式的、容错的实时计算系统。 官网:http://storm.apache.org/
Twitter Storm集群表面上类似于Hadoop集群,Hadoop上运行的是MapReduce Jobs,而Storm运行topologies;但是其本身有很大的区别,最主要的区别在于,Hadoop MapReduce Job运行最终会完结,而Storm topologies处理数据进程理论上是永久存活的,除非你将其Kill掉。
1. Storm集群中包含两类节点:主控节点(Master Node)和工作节点(Work Node)。其分别对应的角色如下:
1).Nimbus (Master Node)
负责在Storm集群内分发代码,分配任务给工作机器,并且负责监控集群运行状态;Nimbus的作用类似于Hadoop中JobTracker。
2). Supervisor(Work Node)
Supervisor负责监听从Nimbus分配给它执行的任务,据此启动或停止执行任务的工作进程(worker)。
3).Nimbus和Supervisor节点之间所有的协调工作是通过Zookeeper集群来实现的
- Nimbus和Supervisor进程都是快速失败(fail-fast)和无状态(stateless)的;
- Storm集群所有的状态要么在Zookeeper集群中,要么存储在本地磁盘上。
这意味着你可以用kill -9来杀死Nimbus和Supervisor进程,它们在重启后可以继续工作。这个设计使得Storm集群拥有不可思议的稳定性。
2. Storm集群上要实现实时计算,需要创建Topologies
运行一个Topology比较简单,首先,你打包所有的代码和依赖关系的包打成一个jar包。然后,运行如下命令:
-
1 storm jar all-my-code.jar backtype.storm.MyTopology arg1 arg2 2 3 //这里运行一个包含arg1和arg2两个参数的backtype.storm.MyTopology类,main方法定义Topology以及提交到Nimbus,storm jar部分连接Nimbus以及上传jar包到集群. 4 5 storm kill {stormname} //To kill a topology
Storm的主要特点如下:
- 简单的编程模型。类似于Mapreduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性。
- 可以使用各种编程语言。你可以在Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。
- 容错性。Storm会管理工作进程和节点的故障。
- 水平扩展。计算是在多个线程、进程和服务器之间并行进行的。
- 可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
- 快速。系统的设计保证了消息能得到快速的处理,使用ZeroMQ作为其用底层消息队列。
- 本地模式。Storm有一个“本地模式”,可以在处理过程中完全模拟Storm集群。这让你可以快速进行开发和单元测试。
Storm的术语:
Stream、Spout、Bolt、Task、Worker、Stream Grouping和Topology
- Stream是被处理的数据。
- Sprout是数据源。
- Bolt处理数据。
- Task是运行于Spout或Bolt中的线程。
- Worker是运行这些线程的进程。
- Stream Grouping规定了Bolt接收什么东西作为输入数据。
- 数据可以随机分配(术语为Shuffle),或者根据字段值分配(术语为Fields),或者 广播(术语为All),或者总是发给一个Task(术语为Global),也可以不关心该数据(术语为None),或者由自定义逻辑来决定(术语为 Direct)。
- Topology是由Stream Grouping连接起来的Spout和Bolt节点网络。
worker
- Supervisor会监听分配给它那台机器的工作,根据需要启动/关闭工作进程,这个工作进程就是worker
- 每一个worker都会占用工作节点的一个端口,这个端口可以在storm.yarm中配置
- 一个topology可能会在一个或者多个工作进程里面执行,每个工作进程执行整个topology的一部分,所以一个运行的topology由运行在很多机器上的很多工作进程组成。
Task
- 每一个Spout和Bolt会被当作很多task在整个集群里面执行。
- 默认情况下每一个task对应到一个线程(Executor),这个线程用来执行这个task,
- 而stream grouping则是定义怎么从一堆task发射tuple到另外一堆task。