您现在的位置是: 首页 > Storm基本概念


Storm基本概念

纯真年代 2018-11-12 11:57:50 0 377人围观

Jstrom1.22基本概念直达车

Storm的主要概念 

1、Topologies(拓扑,将整个流程串起来)
2、Streams(流,数据流)
3、Spouts(产生数据的)
4、Bolts(处理数据的)
5、Stream groupings(数据流的分组策略)
6、Reliability
7、Tasks
8、Workers

供参考


 拓扑(Topologies)

    实时应用程序的逻辑被打包到一个Storm拓扑中。Storm拓扑类似于MapReduce作业。关键的区别是MapReduce作业最终会停止(申请资源-使用资源-释放资源),而拓扑结构会7*24小时运行(除非你kill它)。Topologies是通过流分组(Stream groupings)的方式将spout和bolt连接到一起的(其实就是一个DAG有向无环图)。

TopologyBuilder:使用此类在Java中构建拓扑
在生产群集上运行拓扑
本地模式:在本地模式下开发和测试拓扑。

Streams(流)  

    Streams 是Storm中的抽象概念 ,一个Stream是由无边界的Tuple(元组)组成的,而且它是有序的(sequence),这个Stream将会被分布式的并行处理。Streams使用schema来定义,默认情况下,元组可以包含整数,长整数,短整数,字节,字符串,双精度数,浮点数,布尔值和字节数组,还可以定义自己的序列化程序。

    每个流声明时都被赋予了一个ID。只有一个流的Spout和Bolt非常常见,所以OutputFieldsDeclarer提供了不需要指定ID来声明一个流的函数(Spout和Bolt都需要声明输出的流)。这种情况下,流的ID是默认的“default”。

Tuple:流由元组组成
OutputFieldsDeclarer:用于声明流及其 schemas 信息 
Serialization:有关Storm动态键入元组和声明自定义序列化的信息

Spouts

    Spouts 是我们数据流的源头(是Topology的消息产生者)。通常情况下,spouts从外部源(比如kafka之类的)读取元组并将数据发送到Topology中。Spout可以是可靠的(reliable)或者不可靠(unreliable)的。可靠的Spout能够在一个元组被Storm处理失败时重新发送一份元组数据,而不可靠的Spout将元组数据发送到Topology后,是不关心处理成功还是失败了。

    Spouts可以发出多个流。因此,我们可以使用OutputFieldsDeclarer的declareStream方法声明多个流,并在SpoutOutputCollector上使用emit方法指定要发送到哪个流。

    Spouts的主要方法是nextTuple(此方法是一个死循环)。nextTuple在有数据时就发出新元组数据,没有数据则返回。nextTuple必须是非阻塞的,因为Storm在同一个线程上调用所有spout方法。

    Spout中另外两个主要的函数是ack和fail。当Storm检测元组在Topology中被成功处理时调用ack,没有成功处理时调用fail。只有可靠型的Spout会调用ack和fail函数。

IRichSpout:这是spouts必须实现的接口。
如何保证消息被处理

Bolts  

    Topology中的所有数据处理都是用Bolts完成的。Bolts可以执行任何操作,包括过滤,函数,聚合,连接,与数据库交互等。

    Bolt可以进行简单的数据转换。也可以进行复杂的数据转换, 因此就需要多个Bolt来完成。

     Bolt中的主要方法是execute接收Tuple数据。Bolts也可以使用OutputCollector对象发送新元组(到下游)。 Bolt必须调用ack方法,在OutputCollector处理的每个元组时,以至于让我们storm知道数据被正确的处理。(如果没有正确处理,我们肯定要调用fail方法)

    还可以在Bolt中启动多线程来处理信息,OutputCollector是线程安全的,可以随时调用。

IRichBolt:Bolt的通用接口。
IBasicBolt:为了方便使用,用于定义执行过滤或简单功能的螺栓。
OutputCollector:bolt使用此类的实例将元组发送到其输出流
如何保证消息被处理  

Stream groupings  

    流分组定义了如何在bolt的task中对该流进行分区。

    Storm中有八个内置流分组,您可以通过实现CustomStreamGrouping接口来实现自定义流分组:

    随机分组:元组随机分布在螺栓的任务中,使得每个螺栓都能保证获得相同数量的元组。
    字段分组:流按分组中指定的字段进行分区。例如,如果流按“user-id”字段分组,则具有相同“user-id”的元组将始终执行相同的任务,但具有不同“user-id”的元组可能会执行不同的任务。
    部分密钥分组:流按分组中指定的字段进行分区,如字段分组,但在两个下游螺栓之间进行负载平衡,这可在传入数据偏斜时提供更好的资源利用率。本文对其工作原理及其提供的优势进行了很好的解释。
    所有分组:流被复制到所有bolt任务中。小心使用此分组。
    全局分组:整个流转到了一个bolt的任务。具体来说,它转到id最低的任务。
    无分组:此分组指定您不关心流的分组方式。目前,没有任何分组相当于随机分组。最终,Storm会按下没有分组的螺栓,在与他们订购的螺栓或喷口相同的螺纹中执行(如果可能的话)。
    直接分组:这是一种特殊的分组。以这种方式分组的流意味着元组的生产者决定消费者的哪个任务将接收该元组。直接分组只能在已声明为直接流的流上声明。发送到直接流的元组必须使用[emitDirect]之一(javadocs / org / apache / storm / task / OutputCollector.html#emitDirect(int,int,java.util.List)方法发出。一个bolt可以得到通过使用提供的TopologyContext或跟踪OutputCollector中的emit方法输出(返回元组发送到的任务ID)来消费者的任务ID。
    本地或随机分组:如果目标螺栓在同一工作进程中有一个或多个任务,则元组将被洗牌到只有那些进程内任务。否则,这就像一个普通的shuffle分组。

TopologyBuilder:使用此类来定义拓扑
InputDeclarer:setBolt调用on 时返回此对象TopologyBuilder,用于声明bolt的输入流以及如何对这些流进行分组

Reliability (可靠性)

    Storm保证每个spout元组都将由 Topology完全处理。它通过跟踪每个spout元组触发的元组树并确定元组树何时成功完成来实现。每个拓扑都有一个与其关联的“消息超时”。如果Storm未能检测到在该超时内已完成一个spout元组,则它会使元组数据处理失败时重新发送。

    要利用Storm的可靠性功能,必须在创建元组树中的新边时告诉Storm,并在完成处理单个元组时告诉Storm。这些是使用OutputCollector对象完成的,该对象用于发出元组。标记在emit方法中完成,成功处理一个元组后需要使用ack函数来告诉Storm。


如何保证消息被处理    

Tasks

    task是每个spout或bolt在整个集群中执行任意数量的任务。每个task对应一个执行线程,流分组定义如何将元组从一组任务发送到另一组任务。您可以在TopologyBuilder的setSpoutand和setBolt方法中为每个spout或bolt设置并行度。

Workers

    Topology在一个或多个工作进程中执行。每个工作进程都是物理JVM,并执行Topology的所有任务的子集(一个worker进程执行的是一个topo的子集)。





全部评论