storm supervisor启动报错java.lang.RuntimeException: java.io.EOFException

现象

因春节公司断电,导致开始环境的storm异常停止,节后启动发现supervisor无法启动,异常信息如下:

2015-03-05 10:30:43 b.s.d.supervisor [INFO] Starting supervisor with id ce54308d-a42c-46f9-8e90-1760d7ea3bfa at host host18190
2015-03-05 10:30:44 b.s.event [ERROR] Error when processing event
java.lang.RuntimeException: java.io.EOFException
        at backtype.storm.utils.Utils.deserialize(Utils.java:86) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.utils.LocalState.snapshot(LocalState.java:45) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.utils.LocalState.get(LocalState.java:56) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.daemon.supervisor$sync_processes.invoke(supervisor.clj:207) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at clojure.lang.AFn.applyToHelper(AFn.java:161) ~[clojure-1.4.0.jar:na]
        at clojure.lang.AFn.applyTo(AFn.java:151) ~[clojure-1.4.0.jar:na]
        at clojure.core$apply.invoke(core.clj:603) ~[clojure-1.4.0.jar:na]
        at clojure.core$partial$fn__4070.doInvoke(core.clj:2343) ~[clojure-1.4.0.jar:na]
        at clojure.lang.RestFn.invoke(RestFn.java:397) ~[clojure-1.4.0.jar:na]
        at backtype.storm.event$event_manager$fn__2593.invoke(event.clj:39) ~[na:na]
        at clojure.lang.AFn.run(AFn.java:24) ~[clojure-1.4.0.jar:na]
        at java.lang.Thread.run(Thread.java:701) ~[na:1.6.0_34]
Caused by: java.io.EOFException: null
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323) ~[na:1.6.0_34]
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2792) ~[na:1.6.0_34]
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800) ~[na:1.6.0_34]
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) ~[na:1.6.0_34]
        at backtype.storm.utils.Utils.deserialize(Utils.java:81) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        ... 11 common frames omitted
2015-03-05 10:30:44 b.s.event [ERROR] Error when processing event
java.lang.RuntimeException: java.io.EOFException
        at backtype.storm.utils.Utils.deserialize(Utils.java:86) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.utils.LocalState.snapshot(LocalState.java:45) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.utils.LocalState.get(LocalState.java:56) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]
        at backtype.storm.daemon.supervisor$mk_synchronize_supervisor$this__5005.invoke(supervisor.clj:307) ~[na:na]
        at backtype.storm.event$event_manager$fn__2593.invoke(event.clj:39) ~[na:na]
        at clojure.lang.AFn.run(AFn.java:24) ~[clojure-1.4.0.jar:na]
        at java.lang.Thread.run(Thread.java:701) ~[na:1.6.0_34]
Caused by: java.io.EOFException: null
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2323) ~[na:1.6.0_34]
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2792) ~[na:1.6.0_34]
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:800) ~[na:1.6.0_34]
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298) ~[na:1.6.0_34]
        at backtype.storm.utils.Utils.deserialize(Utils.java:81) ~[storm-core-0.9.1-incubating.jar:0.9.1-incubating]

解决方法

删除storm.yaml中配置的storm.local.dir指向的目录中的supervisor和workers两个目录,再次启动问题解决

解决问题时参考了以下文章:supervisor启动报错java.lang.RuntimeException: java.io.EOFException

### Java Task Supervisor TimeoutException 解决方案 在处理 `TimeoutException` 异常时,特别是在涉及定时任务的情况下,理解任务的执行机制及其配置至关重要。对于Eureka客户端中的定时任务,存在两种主要类型的周期性操作:一是向 Eureka 注册中心发送心跳请求;二是定期从 Eureka 获取最新的服务注册表信息[^3]。 #### 调整超时设置 默认情况下,这两种任务每隔 30 秒执行一次,并且它们各自的超时时间为 30 秒。如果某个任务未能在此时间内完成,则会触发 `TimeoutException`。为了减少此类异常的发生频率,可以考虑增加这些任务的最大允许响应时间: ```properties # application.properties 或 bootstrap.properties 文件中添加如下配置项 eureka.instance.leaseRenewalIntervalInSeconds=60 eureka.client.registryFetchIntervalSeconds=60 ``` 通过延长这两个参数的时间间隔至更合理的数值(例如60秒),能够给予网络延迟和其他潜在因素更多的缓冲空间,从而降低因短暂性能波动而导致失败的风险。 #### 实现重试逻辑 除了调整超时期限外,在遇到临时性的连接问题或其他瞬态错误时引入适当的重试策略也是有效的措施之一。可以在应用程序级别实现这一功能,或者利用第三方库来简化开发工作量。下面展示了一个简单的基于指数退避算法的重试模板: ```java public class RetryTemplate { private static final int MAX_RETRIES = 5; public <T> T execute(Callable<T> callable) throws Exception { int attemptCount = 0; while (true) { try { return callable.call(); } catch (Exception ex) { ++attemptCount; if (attemptCount >= MAX_RETRIES || !(ex instanceof TimeoutException)) { throw ex; // 如果达到最大尝试次数或不是超时异常则抛出原始异常 } Thread.sleep((long)Math.pow(2, attemptCount)); // 使用指数增长等待时间 } } } } ``` 此方法接受一个实现了 `Callable` 接口的对象作为输入参数,并在其内部循环调用目标函数直到成功返回结果或超出预设的最大重试次数为止。每次发生异常后都会按照指数级递增的方式暂停一段时间再继续下一轮尝试,以此方式有效应对短时的服务不可达状况。 #### 日志记录与监控 良好的日志管理和实时监控同样不可或缺。确保所有关键路径上的事件都被充分记录下来以便后续排查问题根源所在。同时借助专业的APM工具持续跟踪应用的整体健康状态以及各项指标的变化趋势,及时发现并解决问题苗头。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值