Storm基础概念

概念

Topologies(拓扑)

实时应用程序的逻辑被封装在Storm topology(拓扑)中,Storm topolopy(拓扑)类似于MapReduce作业,两者之间关键的区别是MapReduce作业最终会完成,而topology任务会永远运行(除非kill它),一个拓扑是Spout和Bolt通过stream groupings连接起来的有向无环图。

Streams(流)

  • stream是storm中的核心概念,一个stream是一个无界的、以分布式方式并行创建和处理的Tuple序列,stream以一个schema来定义,这个schema用例命名stream tuple(元祖)中的字段。默认情况下,Tuple可以包含integers,longs,strings,doubles,floats,booleans,and byte arrays等数据类型,也可以定义自己的serializers,以至于可以在tuple中使用自定义的类型
  • 每一个流在声明的时候会赋予一个ID,由于包含一个stream的spout和bolt比较常见,OutputFieldsDeclarer有更方便的方法可以定义一个单一的stream而不用指定ID,这个stream被赋予一个默认的ID,“default”。

Spouts

  • Spout是一个topology中streams的源头,通常spout会从外部数据源读取tuple,然后把他们发送到拓扑中,Spout可以是可靠的或不可靠的,可靠的spout在storm处理失败的时候能够重放tuple,不可靠的spout一旦把一个tuple发送出去就撒手不管了
  • spout可以发送多个流,可以使用OutputFieldsDeclarer的declareStream方法定义多个流,在SpoutOutputCollector对象的emit方法中指定要发送的stream
  • spout中最重要的方法是nextTuple,nextTuple要么向topology中发送一个新的tuple,要么在没有tuple需要发送的情况下直接返回,对于任何spout实现,nextTuple方法都必须非阻塞的,因为storm在一个线程中调用所有的spout方法
  • spout的另外几个重要的方法是ack好fail,这些方法在storm检测到spout发送出去的tuple被成功处理或者处理失败的时候调用,ack和fail只会在可靠的spout中调用。

Bolts

  • 拓扑中所有的业务处理都在bolts中完成,bolt可以做很多事情,过滤、函数、聚合、关联、与数据库交互等;
  • bolt可以做简单stream转换,复杂的steam转换一般需要多个步骤,因此也要多个bolt协同工作
  • bolt可以发送多个stream,可以使用OutputFieldsDeclarer的declareStream方法定义多个streams,并且在使用OutputCollector.emit方法的时候指定要发送的stream
  • bolt中最主要的方法是execute方法,当有一个新的tuple输入的时候会进入这个方法,bolt使用OutputCollector对象发送新的tuple,bolt必须在每一个tuple处理完以后调用OutputCollector上的ack方法,Storm就会知道tuple什么时候完成,当处理一个输入的tuple,会基于这个tuple产生零个或者多个tuple发送出去,当所有的tuple完成后,会调用acking,storm提供了IBasicBolt接口会自动执行acking。
  • 最好在bolt中启动新的县城异步处理tuples,OutputCollector是县城安全的,并且可以在任何时刻调用。

Stream groupings

topology定义中有一部分是为每一个bolt指定输入的streams,stream grouping定义了stream如何在bolts tasks之间分区
stream中一共有8个内置的stream grouping,也可以通过实现CustomStreamGrouping接口来自定义stream gruoupings

  • Shuffle grouping
    Tuple随机的分发到bolt task,每个bolt获取到等量的tuple
  • Fields grouping
    streams通过grouping指定的字段来分区,例如流通过user-id字段分区,具有相同user-id的tuple会发送到同一个task,不同user-id的tuple可能会流入到不同的tasks
  • Partial key grouping
    stream通过grouping中指定的field来分组,与field grouping相似,但是对于2个下游的bolt来说是负载均衡的,可以在输入数据部平均的情况下提供更好的优化。
  • All grouping
    stream在所有的bolt tasks质检复制,这个grouping小心使用
  • Global grouping
    整个stream会进入bolt其中一个任务,特别指出,它会进入id最小的task
  • None grouping
    这个 grouping , 你不需要关心 stream 如何分组. 当前, None grouping 和 Shuffle grouping 等价. 同时, Storm 将使用 None grouping 的 bolts 和上游订阅的 bolt和spout 运行在同一个线程 (when possible).
  • Direct grouping
    这是一种特殊的 grouping 方式. stream 用这个方式 group 意味着由这个 Tuple 的 生产者 来决定哪个 消费者 来接收它. Direct grouping 只能被用于 direct streams . 被发射到 direct stream 的 tuple 必须使用 emitDirect(int, int, java.util.List) 方法来发送. Bolt 可以使用 TopologyContext 或者通过保持对OutputCollector(返回 Tuple 被发送到的目标 task id) 中的 emit 方法输出的跟踪,获取到它的所有消费者的 ID
  • Local or shuffle grouping
    如果目标 Bolt 有多个 task 和 streams源 在同一个 woker 进程中, Tuple 只会 shuffle 到相同 worker 的任务.否则, 就和 shuffle goruping 一样.

Tasks

  • 每个Spout或者Bolt都以跨集群的多个task方式执行,每个task对应一个execution的县城,stream groupings定义如果从一个task发送tuple到另一个task,可以在TopologyBuilder的setSpout和setBolt方法中为每个Spout或者Bolt设置并行度

Workers

  • Topology在一个或者跨多个worker执行,每个worker进程是一个物理的JVM,执行拓扑Tasks中的一个子集,例如:如果一个拓扑的并行度是300,共有50个worker在运行,每个worker会分配到6个task,storm会尽量把所有task均匀的分配到所有的worker上
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值