5.27.1 Storm 基本原理
Apache Storm是一个分布式、可靠、容错的实时流式数据处理的系统。在Storm中,
先要设计一个用于实时计算的图状结构,我们称之为拓扑(topology)。这个拓扑将 会被提交给集群,由集群中的主控节点(master node)分发代码,将任务分配给工作 节点(worker node)执行。一个拓扑中包括spout和bolt两种角色,其中spout发送消 息,负责将数据流以tuple元组的形式发送出去;而bolt则负责转换这些数据流,在 bolt中可以完成计算、过滤等操作,bolt自身也可以随机将数据发送给其他bolt。由 spout发射出的tuple是不可变数组,对应着固定的键值对。
图5-121 Storm 系统架构
业务处理逻辑被封装进Storm中的Topology中。一个Topology是由一组Spout组件(数 据源)和Bolt组件(逻辑处理)通过Stream Groupings进行连接的有向无环图
(DAG)。Topology里面的每一个Component(Spout/Bolt)节点都是并行运行的。
在Topology里面, 可以指定每个节点的并行度,Storm则会在集群里面分配相应的 Task来同时计算,以增强系统的处理能力。
图5-122 Topology
Storm有众多适用场景:实时分析、持续计算、分布式ETL等。Storm有如下几个特 点:
● 适用场景广泛
● 易扩展,可伸缩性高
● 保证无数据丢失
● 容错性好
● 易于构建和操控
● 多语言
Storm作为计算平台,在业务层为用户提供了更为易用的业务实现方式:CQL
(Continuous Query Language—持续查询语言)。CQL具有以下几个特点:
● 使用简单:CQL语法和标准SQL语法类似,只要具备SQL基础,通过简单地学习,
即可快速地进行业务开发。
● 功能丰富:CQL除了包含标准SQL的各类基本表达式等功能之外,还特别针对流处 理场景增加了窗口、过滤、并发度设置等功能。
● 易于扩展:CQL提供了拓展接口,以支持日益复杂的业务场景,用户可以自定义 输入、输出、序列化、反序列化等功能来满足特定的业务场景
● 易于调试:CQL提供了详细的异常码说明,降低了用户对各种错误的处理难度。
关于Storm的架构和详细原理介绍,请参见:https://storm.apache.org/。
Storm 原理
● 基本概念
表5-25 概念介绍
概念 说明
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。
图5-123描述了一个由Spout、Bolt组成的DAG,即Topology。图中每个矩型框代 表Spout或者Bolt,矩型框内的节点表示各个并发的Task,Task之间的“边”代表 数据流——Stream。
图5-123 Topology 示意图
● 可靠性
Storm提供三种级别的数据可靠性:
– 至多一次:处理的数据可能会丢失,但不会被重复处理。此情况下,系统吞 吐量最大。
– 至少一次:保证数据传输可靠,但可能会被重复处理。此情况下,对在超时 时间内没有获得成功处理响应的数据,会在Spout处进行重发,供后续Bolt再 次处理,会对性能稍有影响。
– 精确一次:数据成功传递,不丢失,不冗余处理。此情况下,性能最差。
可靠性不同级别的选择,需要根据业务对可靠性的要求来选择、设计。例如对于 一些对数据丢失不敏感的业务,可以在业务中不考虑数据丢失处理从而提高系统 性能;而对于一些严格要求数据可靠性的业务,则需要使用精确一次的可靠性方 案,以确保数据被处理且仅被处理一次。
● 容错
Storm是一个容错系统,提供较高可用性。表5-26从Storm的不同部件失效的情况 角度解释其容错能力:
表5-26 容错能力
失效场景 说明
Nimbus失效 Nimbus是无状态且快速失效的。当主Nimbus失效时,备 Nimbus会接管,并对外提供服务。
Supervisor失效 Supervisor是工作节点的后台守护进程,是一种快速失效机 制,且是无状态的,并不影响正在该节点上运行的Worker,
但是会无法接收新的Worker分配。当Supervisor失效时,
OMS会侦测到,并及时重启该进程。
Worker失效 该Worker所在节点上的Supervisor会在此节点上重新启动该 Worker。如果多次重启失败,则Nimbus会将该任务重新分 配到其它节点。
失效场景 说明
节点失效 该节点上的所有分配的任务会超时,而Nimbus会将这些 Worker重新分配到其他节点。
Storm 开源特性
● 分布式实时计算框架
开源Storm集群中的每台机器上都可以运行多个工作进程,每个工作进程又可创建 多个线程,每个线程可以执行多个任务,任务是并发进行数据处理。
● 高容错
如果在消息处理过程中有节点、进程等出现异常,提供重新部署该处理单元的能 力。
● 可靠的消息保证
支持At-Least Once、At-Most Once、Exactly Once的数据处理模式。
● 安全机制
提供基于Kerberos的认证以及可插拔的授权机制,提供支持SSL的Storm UI以及 Log Viewer界面,同时支持与大数据平台其他组件(如ZooKeeper,HDFS等)进 行安全集成。
● 灵活的拓扑定义及部署
使用Flux框架定义及部署业务拓扑,在业务DAG发生变化时,只需对YAML DSL
(domain-specific language)定义进行修改,无需重新编译及打包业务代码。
● 与外部组件集成
支持与多种外部组件集成,包括:Kafka、HDFS、HBase、Redis或JDBC/RDBMS 等服务,便于实现涉及多种数据源的业务。
5.27.2 Storm 与其他组件的关系
Storm,提供实时的分布式计算框架,它可以从数据源(如Kafka、TCP连接等)中获 得实时消息数据,在实时平台中完成高吞吐、低延迟的实时计算,并将结果输出到消 息队列或者进行持久化。Storm与其他组件的关系如图5-124所示:
图5-124 组件关系图
Storm 和 Streaming 的关系
Storm和Streaming都使用的开源Apache Storm内核,不同的是,Storm使用的内核版 本是1.2.1,Streaming使用的是0.10.0。Streaming组件一般用来在升级场景继承过度 业务,比如之前版本已经部署Streaming并且有业务在运行的情况下,升级后仍然可以 使用Streaming。如果是新搭建的集群,则建议使用Storm。
Storm 1.2.1新增特性说明:
● 分布式缓存:提供命令行工具共享和更新拓扑的所需要的外部资源(配置),无 需重新打包和部署拓扑。
● Native Streaming Window API:提供基于窗口的API。
● 资源调度器:新增基于资源的调度器插件,可以在拓扑定义时指定可使用的最大 资源,并且通过配置的方式指定用户的资源配额,从而管理该用户名下的拓扑资 源。
● State Management:提供带检查点机制的Bolt接口,当事件失败时,Storm会 自动管理bolt的状态并且执行恢复。
● 消息采样和调试:在Storm UI界面可以开关拓扑或者组件级别的调试,将流消息 按采样比率输出到指定日志中。
● Worker动态分析:在Storm UI界面可以收集Wokrer进程的Jstack、Heap日志,
并且可以重启Worker进程。
● 拓扑日志级别动态调整:提供命令行和Storm UI两种方式对运行中的拓扑日志进 行动态修改。
● 性能提升:与之前的版本相比,Storm的性能得到了显著提升。虽然,拓扑的性能 和用例场景及外部服务的依赖有很大的关系,但是对于大多数场景来说,性能可 以提升3倍。
5.27.3 Storm 开源增强特性
● CQL
CQL(Continuous Query Language),持续查询语言,是一种用于实时数据流 上的查询语言,它是一种SQL-like的语言,相对于SQL,CQL中增加了(时序)窗 口的概念,将待处理的数据保存在内存中,进行快速的内存计算,CQL的输出结 果为数据流在某一时刻的计算结果。使用CQL,可以快速进行业务开发,并方便 地将业务提交到Storm平台开启实时数据的接收、处理及结果输出;并可以在合适 的时候中止业务。
● 高可用性
Nimbus HA机制,避免了开源Storm集群中Nimbus出现单点故障而导致集群无法 提供Topology的新增及管理操作的问题,增强了集群可用性。