storm框架概念
一、storm基本概念
storm是一个开源的分布式实时数据计算系统,Storm可以用来处理源源不断流进来的消息,处理之后将结果写入到某个存储中去。hadoop本质上是一个批处理系统,其缺陷在于不能实时地处理数据,而storm的实时处理数据的能力有效地解决了hadoop的瓶颈。
二、storm架构与hadoop架构的对比
| hadoop架构 | storm架构 |
---|---|---|
系统原理 | 分布式系统(分而治之) | |
主从节点 | JobTracker和TaskTracker进程 | Nimbus和Supervisor进程 |
应用程序名称 | Job | Topology |
工作进程 | Child | Worker |
计算模型 | Map/ Reduce | Spout/ Bolt |
数据处理系统 | 批式处理 | 流式处理 |
框架初始化 | 多次(效率低) | 一次 |
计算状态 | 计算完即终止 | 持续计算 |
三、storm架构的设计
Storm采用Master/Slave体系结构,由Nimbus和Supervisor两类服务进程实现。
在上图中:
Nimbus:运行在集群的主节点,负责任务的指派和分发。
Supervisor:运行在集群的从节点,接受Nimbus分配的任务,管理Worker进程,负责执行任务的具体部分。
Worker:运行具体处理组件逻辑的进程。
Zookeeper集群:是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。
上图中的Nimbus,Supervisor,Worker的信息状况都是放在Zookeeper里。Nimbus和Supervisor之间的所有协调工作都是通过Zookeeper集群完成。Nimbus通过Zookeeper获知其管理的成员的状态,并分发代码,分配任务,保持监听状态。Supervisor通过Zookeeper来监测分给自己端上的任务,根据需要启动关闭Worker。而Worker负责执行分配的任务,并随时将其上的运行状态信息反馈给Zookeeper。(一个supervisor里面有多个workder,一个worker是一个JVM。)
Nimbus和Supervisor守护进程被设计成快速失败的(每当遇到任何意外的情况,进程自动毁灭)和无状态的(所有状态都保存在ZooKeeper或者磁盘上)。Nimbus或者Supervisor的死亡不影响Worker进程的工作。
四、storm数据流模型
数据流(Stream)是Storm中对数据进行的抽象,它是时间上无界的tuple元组序列。消息源Spout是一个Topology的消息生产者,消息源Spout会从一个外部源读取数据并且向topology里面发出消息(tuple)。Bolts可以简单的做消息流的传递(来一个元组,调用一次execute),复杂的则需要进行多层的Bolt处理。Spout负责发射消息,Bolt可以接受消息处理,还能继续往下级的blot发射消息。
下图为Topology内部Spout和Bolt之间的数据流关系(有向无环图):
并行度(parallelism)是特别用来描述所谓的parallelismhint的,这代表1个组件的初始的executor(线程)的数量。
Topology中每一个计算组件(Spout和Bolt)都有一个并行执行度,在创建Topology时可以进行指定,Storm会在集群内分配对应并行度个数的线程来同时执行这一组件。一个topology可能会在一个或者多个worker(工作进程)里面执行,每个worker是一个物理JVM并且执行整个topology的子集。
Spout是Stream的入口,从外部读取数据并发射数据。Spout可以是可靠的也可以是不可靠的,如果这个tuple没有被storm成功处理,可靠的消息源spout会重新发射一个tuple,但不可靠的消息源spout发出一次tuple之后就不会再重发了。
Bolt可以进行操作过滤,聚合,查询数据库等。所有的消息处理逻辑被封装在bolts里。
Tasks是执行任务操作的最小单位。每一个spout和bolt会被当作很多task在整个集群里执行,每一个executor对应一个线程,在这个线程上运行多个task。
五、storm的DAG拓扑
在一个Storm集群中,Storm主要通过以下三个部件来运行拓扑:
工作进程(workerprocesses)(进程数)
执行线程(executors)(线程数)
任务(tasks)(组件数)
其之间的相互关系如下图:
集群中一个机器可以运行着多个的worker进程,对应于一个或者多个topologies。一个woker进程里可以有一个或多个执行线程executor(executor是单线程的),每一个executor又可以运行一个或多个的task组件。同一个executor里的task只能是属于同一个spout/bolt。一个task进行着实际的数据处理。
六、storm的容错机制
Storm提供保证数据处理的机制,即使节点死掉或者丢失消息时也可以保证不丢失。
1.集群节点故障
storm集群节点故障:nimbus会将机器上正在执行的任务转移到其它机器上
zookeeper集群节点故障:zookeeper是分布式的,当挂调一个时,其他机器上的有其备份的信息,及时修复机器即可。
2.任务槽(slot)失败
nimbus失败:nimbus是状态的,不会影响到当前正在执行的任务,需通过外部监控重启。
supervisor失败:supervisor是无状态的,不会影响当前正在执行的任务,需通过外部监控重启。
worker失败:worker上运行着spout或bolt,supervisor负责对worker的监控,尝试重启。
3.任务失败
bolt消息未被应答:其相关的acker超时失败,调用fail。
acker本身失败:所持有的所有消息超时失败,调用fail。
spout任务失败:spout有对接的外部设备(MQ)负责完整性,消息重新放回队列中。