流处理旅程——storm之tuple介绍

核心
介绍tuple的作用

tuple元组
tuple是storm的主要数据结构,并且是storm中使用的最基本单元、数据模型和元组

tuple描述
tuple就是一个值列表,tuple中的值可以是任何类型的,动态类型的tuple的fields可以不用声明,默认情况下,storm中的tuple支持私有类型、字符串、字节数组等作为它的字段值,如果使用其他类型,就需要序列化该类型。
tuple的字段默认类型有:integer、float、double、long、short、string、byte、binary
tuple可以理解成键值对,例如、创建一个bolt要发送2个字段(命名为double和triple),其中键就是定义declareOutputFields方法中的fields对象,值就是在emit方法中发送的values对象,以下是一个简单的例子

public class doubleAndTripleBolt extends BaseRichBolt {
    OutputCollector _collector;
    public void execute(Tuple input) {
    int val=input.getInteger(0);
    _collector.emit(input,new Values(val*2,val*3));
    _collector.ack(input);
    }

    public void prepare(Map conf, TopologyContext context, OutputCollector collector) {
    _collector=collector;
    }

    public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declare(new Fields("double","triple"));
    }

}

此外 在使用storm java包中,backtype.storm.tuple主要有以下几个类:
1、Fileds.class
2、MessageId.class
3、Tuple.class
4、TupleImpl.class
5、Values.class
列出以上内容是为了更好的理解tuple,这样能够从本质上理解tuple,在使用时更加得心应手

tuple的生命周期
了解一个tuple的生命周期就需要查看源码,如下的java代码展示了spout接口发出tuple的整改过程

public interface ISpout extends Serializable{
     void open(Map conf,TopologyContext context,SpoutOutputCollector collector);
     void nextTuple();
     void ack(Object msgId);
     void fail(Object msgId);
     void close();
}

首先,storm调用Spout的nextTuple方法来获取下一个tuple,spout通过open方法的参数提供的SpoutOutputCollector将新tuple发射到其中一个输出消息流

注意:发射tuple时,spout提供一个message-id,通过这个id来追踪该tuple

接下来,storm跟踪该tuple的树形结构是否成功创建,并根据messageid调用spout中的ack函数,以确认tuple是否被完全处理,如果tuple超时,则调用spout的fail方法。
由此看来,同一个tuple不管是acked,还是failed都是由创建它的spout发出并维护的,所以,即使spout在集群环境中同时执行很多的任务,该tuple也不会被其他任务调用或生成acked或failed状态,总之,storm会利用内部的acker机制保证每个tuple被可靠的处理,最后在完成任务后,spout调用close方法结束tuple的使用。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值