热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

StormdeclareOutputFieldsdeclare

最近项目需要开始接触storm,感觉跟spark差距还是不小的,不过每个平台都有各自的优势,不做过多评价。有个地方,一直困扰

最近项目需要开始接触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
只不过里面走的过程十分相似,在此与大家分享分享,如果我哪里说错了欢迎大神请教,免得误导大家。

感谢开源。


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • andr ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • Java编程实践:深入理解方法重载
    本文介绍了Java中方法重载的概念及其应用。通过多个示例,详细讲解了如何在同一类中定义具有相同名称但不同参数列表的方法,以实现更灵活的功能调用。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
author-avatar
永久的花蕾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有