Storm

Storm 核心概念及入门教程

Posted by leone on 2018-11-09

Storm

Storm 核心概念

什么是 Storm

Storm是一个分布式计算框架,主要由Clojure编程语言编写。最初是由Nathan Marz及其团队创建于BackType,该项目在被Twitter取得后开源。它使用用户创建的“管(spouts)”和“螺栓(bolts)”来定义信息源和操作来允许批量、分布式处理流式数据。最初的版本发布于2011年9月17日。Storm应用被设计成为一个拓扑结构,其接口创建一个转换“流”。它提供与MapReduce作业类似的功能,当遇到异常时该拓扑结构理论上将不确定地运行,直到它被手动终止2013年,Apache软件基金会将Storm纳入它的孵化计划。

storm基本概念名称解释

  • topology(拓扑)

Topology 是 storm 中最核心的概念,其是运行在 storm 集群上的一个实时计算应用,相当于 hadoop 中的一个 job,区别于 job 的时,job 会有明确的开始和结束,而 topology 由于实时的流式计算的特殊性,从启动的那一刻起会永远的运行下去,直到手动停止。
Topology 由 stream,spouts,bolts 组成,

  • stream(数据流)

Stream 是 storm 中对数据流的抽象,是由无限制的 tuple 组成的序列。Tuple 可以理解为包含一个或多个键值对的 hash。Tuples 在 stream 中流经 bolts,被逐步处理,最终得到预设的结果。
Stream 可比作一条源源不绝的河流,tuple 就是组成这条河流的无数水滴。每一个 stream 在 storm 中都有一个唯一标示的 id。

  • spout(水龙头、数据源)
    从图一可以看出,spout 是一个 topology 的数据源,负责连接数据源,并将数据转化为 tuple emit 到 topology中,经由 bolts 处理。
    Spout 提供了一对核心方法<ack, fail>来保障 storm 在数据没有被正确处理的情况下,不会被丢弃,仍能被重新处理,当然这是可选的,我们也可以不关心 tuple 是否被正确的处理,只负责向topology 中 emit 数据(在某些场景下可能不需要)。具体实现原理在后文会详细介绍。
    Storm + Kakfa 是很常见的组合,storm提供了storm-kafka扩展,封装了多个可用的 kafka spouts 供直接使用。

  • bolt(螺栓,数据筛选处理)
    Bolt 是 topology 中的数据处理单元,每个 bolt 都会对 stream 中的 tuple 进行数据处理。复杂的数据处理逻辑一般拆分成多个简单的处理逻辑交由每个 Bolt 负责。
    Bolt 可以执行丰富的数据处理逻辑,如过滤,聚合,链接,数据库操作等等。
    Bolt 可以接受任意个数据流中的 tuples,并在对数据进行处理后选择性的输出到多个流中。也就是说,bolt 可以订阅任意数量的spouts 或其他 bolts emit 的数据流,这样最终形成了复杂的数据流处理网络,如图一。
    理解了 storm 的核心概念后,下文将介绍storm的并发机制。

  • stream group(数据流分组)

  • reliability(可靠性)
    storm可以保证每一个spout发出的tuple能够被完整处理,通过跟踪tuple树上的每个tuple,检查是否被成功处理。每个topology有一个超时时间,如果storm检查到某个tuple已经超时,将重新发送该tuple。为了使用这种特性,需要定义tuple的起点,以及tuple被成功处理。更多内容查看Guaranteeing message processing。

  • task(任务)
    task是spout和bolt的实例,他们的nextTuple()和execute()方法会被executors线程调用执行。根据数据流分组来确定如何从某个task中的tuple发送到其他的task。

  • worker(执行者)

topology运行在一个或多个worker进程上,worker是jvm虚拟机,运行topology所有task的一部分。比如,topology的并发是300,有50个worker,那每个worker就有6个task。Storm会平衡所有worker的task数量。通过Config.TOPOLOGY_WORKERS来设置topology的worker数量。