天天看点

《Storm企业级应用:实战、运维和调优》——3.1 Tuple元组

本节书摘来自华章计算机《storm企业级应用:实战、运维和调优》一书中的第3章,第3.1节,作者:马延辉 陈书美 雷葆华著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

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

3.1.1 tuple描述

tuple就是一个值列表,tuple中的值可以是任何类型的,动态类型的tuple的f?ields可以不用声明;默认情况下,storm中的tuple支持私有类型、字符串、字节数组等作为它的字段值,如果使用其他类型,就需要序列化该类型。

tuple的字段默认类型有:integer、float、double、long、short、string、byte、binary(byte[])。

tuple数据结构如图3-1所示。

《Storm企业级应用:实战、运维和调优》——3.1 Tuple元组

tuple可以理解成键值对。例如,创建一个bolt要发送两个字段(命名为double和triple),其中键就是定义在declareoutputfields方法中的fields对象,值就是在emit方法中发送的values对象。以下是一个简单例子。

此外,在使用的storm java包中,backtype.storm.tuple主要有以下几个类:

fileds.class。

messageid.class。

tuple.class。

tupleimpl.class。

values.class。

列出以上内容是为了更好地理解tuple,这样能够从本质上理解tuple,在使用时更加得心应手。

3.1.2 tuple的生命周期

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

首先,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的使命。

继续阅读