Storm-declareOutputFields-declare

本文介绍了在Storm中,不论是Spout还是Bolt的declareOutputFields方法的作用。该方法用于定义元组中变量的结构名称。通过示例,解释了如何在Spout和Bolt中使用此方法发送包含多个变量的元组,并澄清了Values类与ArrayList的关系,帮助理解元组数据的组织方式。

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

最近项目需要开始接触storm,感觉跟spark差距还是不小的,不过每个平台都有各自的优势,不做过多评价。有个地方,一直困扰了我好久,就是不管是spout实现类还是bolt实现类里面都有个declareOutputFields的方法,后面declare出去的东西我是真看不明白有啥用,然后按照官网看了一下,结合自身理解在此梳理一下,如果有同学有同样的问题希望能给你解惑。

如图,这是我的spout中粘贴出来的。就拿这个例子来说,我首先粘上官方的解释:

The stream is the core abstraction in Storm. A stream is an unbounded sequence of tuples that is processed and created in parallel in a distributed fashion. Streams are defined with a schema that names the fields in the stream's tuples. By default, tuples can contain integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays. You can also define your own serializers so that custom types can be used natively within tuples.
Every stream is given an id when declared. Since single-stream spouts and bolts are so common,  OutputFieldsDeclarer  has convenience methods for declaring a single stream without specifying an id. In this case, the stream is given the default id of "default".
具体解释我不多说,我只说核心:流定义元组中变量结构的名字,同时如果流不指定id的话,会有个默认id:default。

 然后带领大家看一下API(java):


那么很明显了,我们知道最顶部调用了第二种方法,也就是他们使用默认的流ID:default。那么这个Fields:word有什么用呢,上面官网说了,他是定义元组中变量结构的名字。我们都知道spout每次调用他的nextTuple方法,他会向着流发送一个元组,那么这个元组里面包含的变量我们不管他是什么类型,她都需要一个名字,我们这里起名字叫做word。返回我们看我是否发送了一个变量:


     没毛病,每次发送一个随机的字符串。现在大家可能对这个方法有了深入点的了解,练习一下,在bolt中,如果我发送很多变量呢:


   tuple是一个静态的方法,具体实现如下:


   其实就是对传入里面的对象封装到一个列表中,返回列表。那么我们declare的时候如何写呢,理论上我们返回了两个变量:


没错就是这么写,我们传入两个参数来分别命名tuple中两个变量。

可能有心人发现了问:楼主你就扯淡吧,下面bolt返回的是ArrayList,那上面返回的是new Values,这俩根本没有可比性好吗。

同学说的好,其实两者虽然调用的类不同,不过两条路线还真是出奇的相似,我们看一下Values类:

他其实也是把new Values里面的东西放入了ArrayList中,如果多个变量的话,declare的时候也声明多个变量名字,我之所以练习的时候给大家讲bolt是为了扩展,记住两者绝非调用相同的emit,spout调用的是:

SpoutOutputCollector
而我这里的bolt调用的是:

BasicOutputCollector
只不过里面走的过程十分相似,在此与大家分享分享,如果我哪里说错了欢迎大神请教,免得误导大家。

感谢开源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值