Storm基础(二)

本文介绍了Storm的基本概念,包括Fields、Tuple、Executor、Task等数据结构和处理单元的定义,以及StreamGroupings中的六种消息分发策略:随机分组、字段分组、全部分组、全局分组、无分组和直接分组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:
  http://blog.youkuaiyun.com/hguisu/article/details/8454368
  http://san-yun.iteye.com/blog/2095475

Storm基本概念

Fields

  存储消息的字段名列表,其所需参数是字段名集合。对于同一条消息,在构建Fields对象时会为其所有的字段建立索引。就相当于列名,而对应的Tuple里面的数据即每一列数据。例如:当申明new Fields("word", “count”)后,发射一条消息new Values(“a”,5),这里会封装成Tuple,然后向下发送。对于这个tuple,就可以通过tuple.getStringByField("word")得到”a”

Tuple

  Tuple是Storm中的主要数据结构。 在Storm发送接收消息的过程中, 每一条消息实际上都是一个Tuple对象。本来应该是一个key-value的map,但是由于各个组件间传递的tuple的字段名称已经事先定义好,所以tuple中只要按序填入各个value就行了,所以就是一个value list。

Executor

  Executor可以理解成一个Worker进程中的工作线程(一个Worker进程中可以有一个或多个Executor线程)。一个Executor中只能运行隶属于同一个component(Spout/Bolt)的task。在默认情况下,一个Executor运行一个task。Spout和Bolt设置的并发度默认就是指的Executor的数量。 

builder.setSpout("MetaqSpout",   // componentID
        new MetaqSpout(),  // Spout 对象
        2);   // Parallelism hint, 相当于Executor的数量

  上面的代码相当于设置componentID为MetaqSpout的Spout的Executor数量为2,相当于起两个线程。

Task

  Worker中每一个spout/bolt的实例称为一个task。可以理解Task则是Spout和Bolt中具体要干的活。一个 Executor 可以负责1个或多个Task。同时,Task 也是各个节点之间进行grouping的单位。默认情况,一个Executor对应一个Task,如果这样设置:

topologyBuilder.setBolt("green-bolt", new GreenBolt(), 2) 
               .setNumTasks(4)
               .shuffleGrouping("blue-spout);

  相当于设置2个Executor 4个Task,这样会起两个线程,每个线程执行2个Task。即每个线程运行两个greenBlot实例。

Stream Groupings

 Stream Grouping(消息分发策略)定义了一个流在Bolt任务间该如何被切分。这里有Storm提供的6个Stream Grouping类型:
 1. 随机分组(Shuffle grouping):随机分发tuple到Bolt的任务,保证每个任务获得相等数量的tuple。
 2. 字段分组(Fields grouping):根据指定字段分割数据流,并分组。保证Stream中指定Field(一个或多个)上数据相同的tuple会发送到相同的Task,但是指定Field上数据不同也是有可能会发到一个Task上的。原理是:对指定的Field上的数据做hash,然后用hash 结果求模得出目标taskId。
 3. 全部分组(All grouping):tuple被复制到bolt的所有任务。这种类型需要谨慎使用。
 4. 全局分组(Global grouping):全部流都分配到bolt的同一个任务。明确地说,是分配给ID最小的那个task。
 5. 无分组(None grouping):不需要关心流是如何分组。目前,无分组等效于随机分组。但最终,Storm将把无分组的Bolts放到Bolts或Spouts订阅它们的同一线程去执行(如果可能)。
 6. 直接分组(Direct grouping):直接分组,这是一种比较特别的分组方法,用这种分组意味着消息的发送者知道由消息接收者的哪个task处理这个消息.如果声明了Direct Grouping的方式发送数据,则必须使用声明为Direct的Stream发送,而且这种消息的tuple必须使用emitDirect方法来发射。Direct的Stream在declareOutputFields(OutputFieldsDeclarer declarer)方法中声明。

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(true, new Fields("MessageExt"));
    declarer.declareStream("directStream", true, new Fields("MessageExt"));
}

  前一个将默认的Stream声明为Direct,后一个将另外一个directStream Stream声明为Direct。当然还可以实现CustomStreamGroupimg接口来定制自己需要的分组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值