最近项目需要开始接触storm,感觉跟spark差距还是不小的,不过每个平台都有各自的优势,不做过多评价。有个地方,一直困扰了我好久,就是不管是spout实现类还是bolt实现类里面都有个declareOutputFields的方法,后面declare出去的东西我是真看不明白有啥用,然后按照官网看了一下,结合自身理解在此梳理一下,如果有同学有同样的问题希望能给你解惑。
然后带领大家看一下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
只不过里面走的过程十分相似,在此与大家分享分享,如果我哪里说错了欢迎大神请教,免得误导大家。
感谢开源。