Storm的基础知识-概念(2)

此页面列出了Storm的主要概念以及可以找到更多信息的资源链接。讨论的概念是:
拓扑,流,Spout,Bolt,流分组,可靠性,任务,workers,性能调优。

拓扑Topology

拓扑是与流分组连接的Spout和Bolt的图形。实时应用程序的逻辑被打包到Storm拓扑中。

资源:

        TopologyBuilder topologyBuilder = new TopologyBuilder();
         .......
            //创建本地storm集群
        LocalCluster localCluster = new LocalCluster();
        localCluster.submitTopology("sumTopology", new Config(), topologyBuilder.createTopology());

流Streams

  • 流是Storm中的核心抽象。在发送元组tuple和设置Bolt时,通过声明流ID可以表明Bolt接受来自哪个流的数据以及发出的流的名称。
  • 流是无限的元组序列,以分布式方式并行处理和创建。Streams是使用模式定义的,该模式命名流的元组中的字段。
  • 默认情况下,元组可以包含整数,长整数,短整数,字节,字符串,双精度数,浮点数,布尔值和字节数组。您还可以定义自己的序列化程序,以便可以在元组中本机使用自定义类型。
  • 声明时,每个流都被赋予一个id。由于单流Spout和Bolt非常常见,因此OutputFieldsDeclarer具有用于在不指定id的情况下声明单个流的便捷方法。在这种情况下,流的默认ID为“default”。
public void declareOutputFields(OutputFieldsDeclarer declarer) {
        declarer.declareStream(BoltOutputStreamId.DATASOURCE,new Fields("visitor"));
    }

资源

Spout

  • spout是拓扑中的流的来源。通常,spouts将从外部源读取元组并将它们发送到拓扑中。
  • Spout可以是可靠的或不可靠的。如果一个元组无法被Storm处理,那么一个可靠的spout能够重发一个元组,而一个不可靠的spout一旦发出就会忘记元组。
  • Spouts可以发出多个流。为此,请使用OutputFieldsDeclarer方法中用declareStream方法声明多个流,并在emit时指定要发出的流。
  • Spout的主要方法是nextTuple。nextTuple把新元组发送到拓扑中,或者在没有要发出的新元组时返回。nextTuple不阻止任何spout实现,因为Storm在同一个线程上调用所有spout方法。
  • Spout的其他主要方法是ack和fail。当Storm需要检测从Spout发出的元组通过拓扑是成功完成还是未能完成时,会调用这些方法。可靠性的Spout会调用Ack和Fail方法。

资源:

Bolts

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

  • Bolt可以进行简单的流转换。进行复杂的流转换通常需要多个步骤,因此需要多个Bolt。例如,对一段话进行单词计数,则需要一个Bolt先把句子分成单词,发送给下一个Bolt进行单个单词计数。

  • Bolt可以发出多个流。为此,请使用OutputFieldsDeclarer中的declareStream方法声明多个流,并在emit时指定要发出的流。

  • 声明bolt的输入流时,通过订阅另一个组件的特定流。
    builder.setBolt(“Bolt的id”,Bolt对象,并行数).shuffleGrouping(输入流来自组件id, 输入流id)
    如果要订阅另一个组件的所有流,则必须单独订阅该组件的每个流。
    在订阅上一个组件的默认流时,.shuffleGrouping(“1”)表示订阅组件“1”上的默认流,并且相当于declarer.shuffleGrouping(“1”, DEFAULT_STREAM_ID)。

  • bolt中的主要方法是execute,execute(Tuple tuple)中tuple是输入元组。Bolts使用声明的OutputCollector对象collector发出新元组。collector.emit(new Values(value));

  • Bolt必须使用声明的OutputCollector对象collector在它处理的每个元组上调用ack方法,以便Storm知道元组何时完成(并且最终可以确定原始的Spout发出的元组是安全的)。在处理输入元组过程中,基于该元组发出0个或多个元组,然后对输入元组进行ACK 确认。Storm提供了一个IBasicBolt接口,它在execute方法中元组处理的末尾默认自动执行ack方法

在异步处理的Bolt中启动新线程是非常适合的。OutputCollector是线程安全的,可以随时调用。

资源:

流分组Stream groupings

定义拓扑的一部分是为每个Bolt指定它接收的输入流。流分组定义了如何在bolt的任务中对该流进行分区。

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

  • 随机分组shuffleGrouping:元组随机分布在Bolt的任务中,使得每个Bolt任务分区都能获得相同数量的元组
  • 字段分组fieldsGrouping:流按分组中指定的字段进行分区。例如,如果流按“user-id”字段分组,则具有相同“user-id”的元组将始终执行相同的任务,但具有不同“user-id”的元组可能会执行不同的任务。
  • 部分密钥分组Partial Key grouping:流按指定的字段进行分区,如字段分组,但在两个下游Bolt之间进行负载平衡,这可在传入数据偏斜时提供更好的资源利用率。其工作原理及其提供的优势
  • 所有分组All grouping:流被复制到所有bolt的任务中。小心使用此分组。
  • 全局分组Global grouping:整个流转到了bolt的一个任务。具体来说,它转到id最低的任务。
  • 无分组None grouping:此分组表明您不关心流的分组方式。目前,没有任何分组相当于随机分组。最终,Storm会把没有分组的Bolt放在 与它订阅的Bolt或Spout 相同的线程中执行(如果可能的话)。
  • 直接分组Direct grouping:这是一种特殊的分组。以这种方式分组的流意味着元组的生产者决定消费者的哪个任务将接收该元组。
  • 本地或随机分组localOrShuffleGrouping:如果目标bolt在同一个工作进程中有一个或多个任务,则元组将被洗牌到只有那些进程内任务。 否则,这就像一个普通的shuffle分组。

资源

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

Reliability可靠性

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

要利用Storm的可靠性功能,必须在创建元组树中的新边时告诉Storm,并在完成处理单个元组时告诉Storm。这些是使用用于发出元组的Collector对象来完成的。锚定在emit方法中完成,并使用ack方法声明您已完成元组。

在保证消息处理(Guaranteeing message processing)中更详细地解释了这一点。

Tasks任务

每个Spout或Bolt在整个群集中执行尽可能多的任务。 每个任务对应一个执行线程,流分组定义如何将元组从一组任务发送到另一组任务。 您可以在TopologyBuilder的setSpout和setBolt方法中为每个Spout或Bolt设置并行度。

Workers

拓扑在一个或多个工作进程中执行。 每个工作进程都是物理JVM,并执行拓扑的所有任务的子集。 例如,如果拓扑的组合并行度为300且分配了50个工作线程,则每个工作线程将执行6个任务(作为工作线程中的线程)。 Storm试图在所有Workers之间平均分配任务。

资源:
Config.TOPOLOGY_WORKERS:设置为执行拓扑而分配的workers数.

性能调优

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值