Storm学习(一):认识Storm
实时流计算
传统DBMS不是为快速连续地存放单独的数据单元而设计,而且也不支持持续处理,而持续处理是数据流应用的典型特征。一些方案采用MapReduce来处理实时数据流。但是尽管MapReduce做了实时性改进,也很难稳定地满足应用需求。这是因为Hadoop MapReduce框架为批处理做了高度优化,典型的是通过调度批量任务来操作静态数据,任务不是常驻服务,数据也不是实时流入。
实时计算流程
1、数据采集
功能上保证可以完整的收集到所有日志数据,为实时应用提供实时数据;响应时间上要保证实时性、低延迟;配置简单,部署容易;系统稳定可靠等。
目前采集数据工具有:
- Facebook开源的Scribe
- LinkedIn开源的Kafka
- Cloudera开源的Flume
- 淘宝开源的TimeTunnel
- Hadoop的Chukwa等
2、数据实时计算
适应流式数据、不间断查询;系统稳定可靠、可扩展性好、可维护性好。需要关注的注意点:** 分布式计算、并行计算、热点数据缓存策略、服务端计算。**
3、实时数据查询
- 全内存:直接提供数据读取、定期转存到磁盘或者数据库中进行持久化;
- 半内存:使用Redis、Memcache、MongoDB、等内存数据库提供数据库实时查询范围,由这些系统进行持久化操作;
- 全磁盘:使用HBase等分布式文件系统(HDFS)为基础的NoSQL数据库,对于KeyValue内存引擎,关键是设计好Key。
实时计算框架
- IBM的StreamBase
- Yahoo的S4
设计特点:
- Actor计算模型
- 对等集群架构
- 课插拔体系架构
- 支持部分容错
- Twitter的Storm
主要特点:
- 简单模型;
- 可以使用各种编程语言.默认支持Clojure、Java、Ruby和Python。要增加其他支持,只需要实现一个简单的Storm通信协议;
- 容错性、水平扩展、可靠消息处理、快速、本地模式。
- Twitter的Rainbird
- Facebook的Puma
- 阿里的JStorm
- 其他的如:HStreaming、Esper、Borealis
Storm设计
在Storm中流是有Spout作为源头源源不断产生Tuple,Tuple流向Bolt处理。Spout产生Tuple流向Bolt整体称之为Topology。提交Topology到Storm集群执行,Topology就是一个流转换图。
Storm核心组件
- 主节点Nimbus
主节点通常运行一个后台查询—Numbus,用于响应发布在集群中的节点,分配任务和监测故障,这类似于Hadoop中的JobTracker。Nimbus进程是快速失败和无状态的,所有的状态要么在ZooKeeper中,要么在本地磁盘上。
- 工作节点Supervisor
工作节点同样会运行一个后台程序—Supervisor,用于收听工作指派并基于要求运行工作进程。每个工作节点都是Topology中一个子集的实现。Nimbus和Supervisor之间协调通过ZooKeeper,Supervisor同Nimbus是无状态的,
- 协调服务组件ZooKeeper
- 其他核心组件
- 具体处理事务进程Worker:运行具体处理组件逻辑的进程;
- 具体处理现场Task:Worker中每一个Spout/Bolt线程称为一个Task。在Storm 0.8之后,Task不再与物理线程对应,同一个Spoot/Bolt的Task可能会共享一个物理线程,该线程称为Executor
Storm特性
- 编程模型简单
- 可扩展
- 高可靠性
在Spout发出消息后,可能会触发成千上万条消息,Storm会保证所有消息被处理完成,才认为该Spout消息被完全处理。如果在限定时间内没有完全处理,那么Spout发出的消息就会重发。为了减少内存消耗,Storm不会跟踪所有消息,Storm通过对所有消息的唯一ID进行异或计算,通过是否为0来判断Spout发出的消息是否被处理
- 高容错性
- 支持本地模式
- 支持多种编程语言
- 高效