storm-关于Tick的坑

2023-10-29 18:48
文章标签 tick storm

本文主要是介绍storm-关于Tick的坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题场景

优化storm下的一个bolt任务,测试时注释掉了一段关于Tick代码(为了不影响客户数据一致性),部署到测试环境报了个类型转换的错误。

现象

用了以下代码,是一个bolt部分代码

测试环境启动后stormUI中的bolt作业报错 java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

	@Overridepublic Map<String, Object> getComponentConfiguration() {Config conf = new Config();conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 300);return conf;}@Overridepublic void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {if (tuple == null) {return;}/*if (TupleUtils.isTick(tuple)) {// 处理逻辑return;}*/String json = tuple.getString(0); // 此处报类型转换错误,java.lang.RuntimeException: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String // 处理逻辑}

分析

跟踪tuple.getString(0)至storm内部代码如下:

1	String getString(int var1);  // 接口里的方法定义2   public String getString(int i) {	// TupleImpl里的实现return (String)this.values.get(i);}3   private List<Object> values;	// TupleImpl里的集合定义
  1. 上述步骤1没啥说的,直接看接口方法实现2,发现storm在处理tuple时是把数据加载到了values列表对象,values里的类型是Object,好嘛 这时候强制转换就会有类型转换出错的风险,不知道为啥storm源码这么写。

  2. 有了这个风险再结合打印出的tuple源日志信息,发现报错时这个tuple为{“rate_secs”: 300}, 看为啥是300,代码里这个bolt把tuple类型设置成TOPOLOGY_TICK_TUPLE_FREQ_SECS了,tickTuple是Storm中引入的一种定时机制,利用tickTuple能够实现间隔一段时间进行某种处理的逻辑,当到了处理时返回的tuple就为{“rate_secs”: 300},而测试环境把处理逻辑注释了,直接走到了tuple.getString(0),接着storm坑爹的用了强制转换为String,于是报错。

日志截图:
在这里插入图片描述

处理

找到原因就好办了,把代码放开且注释内部处理逻辑即可。

正确代码

	@Overridepublic Map<String, Object> getComponentConfiguration() {Config conf = new Config();conf.put(Config.TOPOLOGY_TICK_TUPLE_FREQ_SECS, 300);return conf;}@Overridepublic void execute(Tuple tuple, BasicOutputCollector basicOutputCollector) {if (tuple == null) {return;}if (TupleUtils.isTick(tuple)) {/*// 处理逻辑*/return;}String json = tuple.getString(0); // 当tuple类型为tick时无法到达此处// 处理逻辑}

这篇关于storm-关于Tick的坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302644

相关文章

Storm浅析

本文分为几个模块: 1:Storm的原理和基本架构 2:Storm的应用场景及实例 3:Storm与Spark的比较 下面开始介绍,参考资料会列在文章末尾。 1:Storm的原理和基本架构 (1)原理及核心概念 分布式的实时计算系统,能够可信任的处理大量的流式数据,就好比Hadoop对于批量数据进行的处理一样;通常来说,Hadoop能够进行大批量数据的离线处理,但是在实时计算上的表现

storm安装、运行

环境:centos6.4 软件: jzmq-master-----java与c++通讯的桥梁,有了它,就可以使用zeromp了(提供了接口,把数据放入到zeromq中) storm-0.8.2 zeromq-2.1.7-----号称史上最牛逼的消息队列(用c++写的) zookeeper-3.4.5 1.编译安装ZMQ: tar -xzf zeromq-2.1.7.tar.gz cd ze

一、storm基础概念

1、什么是storm        Storm是一个分布式的、高容错的实时计算系统。 Storm对于实时计算的的意义相当于Hadoop对于批处理的意义。Hadoop为我们提供了Map和Reduce原语,使我们对数据进行批处理变的非常的简单和优美。同样,Storm也对数据的实时计算提供了简单Spout和Bolt原语。 Storm适用的场景: (1)、流数据处理:Storm可以用来用来处理源源不断的

Storm AI : 最佳长文写作工具

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话:       正如Storm其名,这场风暴已经在欧美学术圈开始刮起来了。想象一下,当你准备写一篇论文或者一部长篇报告时,只需要告诉Storm你的写作主题是什么,它就能自动帮你全网深挖资料和收集多维度的参考信息,创建好大纲。接下来Storm还会扮演专家与你来上几轮对话问答,并在随后的几秒钟内将你的主题转换为长

Storm计算框架

工作流程 主要组件 streams spouts Bolt Tuple Topology stream grouping

Apache Storm:入门了解

前言 Storm 是一个开源的分布式实时计算系统,它能够处理无边界的数据流,类似于 Hadoop 对于批量数据处理的作用,但是 Storm 更侧重于实时数据流的处理。以下是关于 Storm 的一些关键特性及其应用场景的详细介绍: 特性 实时处理: Storm 能够实时处理数据流,而不是像 Hadoop 那样需要先收集一批数据再进行处理。它可以持续不断地处理数据,这意味着一旦数据到达,就

Storm在Zookeeper中的目录结构

Posted by WeYo. 转载请注明出处:http://weyo.me/pages/techs/storm-with-zookeeper/ 本文主要参考自 xumingming 的博文 Twitter Storm源代码分析之ZooKeeper中的目录结构。由于新版本的 Storm 在架构上有了较大的变化,相应的目录结构也有了一些改变。本文主要针对 0.9.x 版本的 Storm

Storm中遇到的日志多次重写问题(一)

原文: http://www.cnblogs.com/zpfbuaa/p/5974000.html 业务描述:   统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数。并且每过5秒将数据按照json文件的形式写入日志。其中保存为json数据的格式为:时间戳 + 进程名称 + 读kafka数据条数 + 写入

Storm的Spout和Bolt中的方法

一、Spout中的方法 1.open 当一个Task被初始化的时候会调用此open方法。一般都会在此方法中对发送Tuple的对象SpoutOutputCollector和配置对象TopologyContext初始化。 2.declareOutputFields    此方法用于声明当前Spout的Tuple发送流。Stream流的定义是通过OutputFieldsDecl

error:loading /system/media/audio/ui/Effect_Tick.ogg

error loading /system/media/audio/ui/Effect_Tick.ogg  问题原因:      同一个AVD,调试了很多个项目,产生了N多个log文件,这些文件可能产生了影响。 解决办法:     新建一个AVD即可。 AVD的全称为:Android Virtual Device, 就是Android运行的虚拟设备,他是Android的模拟器识别。