Storm基本原理
Apache Storm是一个分布式、可靠、容错的实时流式数据处理的系统。在Storm中,先要设计一个用于实时计算的图状结构,称之为拓扑(topology)。这个拓扑将会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由spout发射出的tuple是不可变数组,对应着固定的键值对。
业务处理逻辑被封装进Storm中的Topology中。一个Topology是由一组Spout组件(数据源)和Bolt组件(逻辑处理)通过Stream Groupings进行连接的有向无环图(DAG)。Topology里面的每一个Component(Spout/Bolt)节点都是并行运行的。在Topology里面, 可以指定每个节点的并行度,Storm则会在集群里面分配相应的Task来同时计算,以增强系统的处理能力。
Storm有众多适用场景:实时分析、持续计算、分布式ETL等。Storm有如下几个特点:
- 适用场景广泛
- 易扩展,可伸缩性高
- 保证无数据丢失
- 容错性好
- 易于构建和操控
- 多语言
Storm作为计算平台,在业务层为用户提供了更为易用的业务实现方式:CQL(Continuous Query Language—持续查询语言)。CQL具有以下几个特点:
- 使用简单:CQL语法和标准SQL语法类似,只要具备SQL基础,通过简单地学习,即可快速地进行业务开发。
- 功能丰富:CQL除了包含标准SQL的各类基本表达式等功能之外,还特别针对流处理场景增加了窗口、过滤、并发度设置等功能。
- 易于扩展:CQL提供了拓展接口,以支持日益复杂的业务场景,用户可以自定义输入、输出、序列化、反序列化等功能来满足特定的业务场景
- 易于调试:CQL提供了详细的异常码说明,降低了用户对各种错误的处理难度。
关于Storm的架构和详细原理介绍,请参见:https://storm.apache.org/。
Storm原理
- 基本概念
表1 概念介绍 概念
说明
Tuple
Storm核心数据结构,是消息传递的基本单元,不可变Key-Value对,这些Tuple会以一种分布式的方式进行创建和处理。
Stream
Storm的关键抽象,是一个无边界的连续Tuple序列。
Topology
在Storm平台上运行的一个实时应用程序,由各个组件(Component)组成的一个DAG(Directed Acyclic Graph)。一个Topology可以并发地运行在多台机器上,每台机器上可以运行该DAG中的一部分。Topology与Hadoop中的MapReduce Job类似,不同的是,它是一个长驻程序,一旦开始就不会停止,除非人工中止。
Spout
Topology中产生源数据的组件,是Tuple的来源,通常可以从外部数据源(如消息队列、数据库、文件系统、TCP连接等)读取数据,然后转换为Topology内部的数据结构Tuple,由下一级组件处理。
Bolt
Topology中接受数据并执行具体处理逻辑(如过滤,统计、转换、合并、结果持久化等)的组件。
Worker
是Topology运行态的物理进程。每个Worker是一个JVM进程,每个Topology可以由多个Worker并行执行,每个Worker运行Topology中的一个逻辑子集。
Task
Worker中每一个Spout/Bolt的线程称为一个Task。
Stream groupings
Storm中的Tuple分发策略,即后一级Bolt以什么分发方式来接收数据。当前支持的策略有:Shuffle Grouping, Fields Grouping, All Grouping, Global Grouping, Non Grouping, Directed Grouping。
图3描述了一个由Spout、Bolt组成的DAG,即Topology。图中每个矩形框代表Spout或者Bolt,矩形框内的节点表示各个并发的Task,Task之间的“边”代表数据流——Stream。
- 可靠性
Storm提供三种级别的数据可靠性:
- 至多一次:处理的数据可能会丢失,但不会被重复处理。此情况下,系统吞吐量最大。
- 至少一次:保证数据传输可靠,但可能会被重复处理。此情况下,对在超时时间内没有获得成功处理响应的数据,会在Spout处进行重发,供后续Bolt再次处理,会对性能稍有影响。
- 精确一次:数据成功传递,不丢失,不冗余处理。此情况下,性能最差。
可靠性不同级别的选择,需要根据业务对可靠性的要求来选择、设计。例如对于一些对数据丢失不敏感的业务,可以在业务中不考虑数据丢失处理从而提高系统性能;而对于一些严格要求数据可靠性的业务,则需要使用精确一次的可靠性方案,以确保数据被处理且仅被处理一次。
- 容错
Storm是一个容错系统,提供较高可用性。表2从Storm的不同部件失效的情况角度解释其容错能力:
表2 容错能力 失效场景
说明
Nimbus失效
Nimbus是无状态且快速失效的。当主Nimbus失效时,备Nimbus会接管,并对外提供服务。
Supervisor失效
Supervisor是工作节点的后台守护进程,是一种快速失效机制,且是无状态的,并不影响正在该节点上运行的Worker,但是会无法接收新的Worker分配。当Supervisor失效时,OMS会侦测到,并及时重启该进程。
Worker失效
该Worker所在节点上的Supervisor会在此节点上重新启动该Worker。如果多次重启失败,则Nimbus会将该任务重新分配到其他节点。
节点失效
该节点上的所有分配的任务会超时,而Nimbus会将这些Worker重新分配到其他节点。
Storm开源特性
- 分布式实时计算框架
开源Storm集群中的每台机器上都可以运行多个工作进程,每个工作进程又可创建多个线程,每个线程可以执行多个任务,任务是并发进行数据处理。
- 高容错
- 可靠的消息保证
- 安全机制
提供基于Kerberos的认证以及可插拔的授权机制,提供支持SSL的Storm UI以及Log Viewer界面,同时支持与大数据平台其他组件(如ZooKeeper,HDFS等)进行安全集成。
- 灵活的拓扑定义及部署
使用Flux框架定义及部署业务拓扑,在业务DAG发生变化时,只需对YAML DSL(domain-specific language)定义进行修改,无需重新编译及打包业务代码。
- 与外部组件集成
支持与多种外部组件集成,包括:Kafka、HDFS、HBase、Redis或JDBC/RDBMS等服务,便于实现涉及多种数据源的业务。