Storm1.1.1分析-Python中添加定时器引起ShellBolt错误的解决过程

先说结论:storm里,不能在python脚本中添加读取消息的定时任务。

问题描述

问题来源

在一个消息消费场景里,需要从redis(pub/sub模式)或者storm中接收消息,然后进行批量处理。 说明下,redis和storm并不同时共存,程序会根据系统环境和配置选择不同的数据源,但消息处理方式是一致的。

批量处理主要分为两类:

  1. 数量阈值批处理,即消息数量达到设定的阈值,开始进行批处理;
  2. 时间阈值批处理,即使用定时器,定期批量处理消息,有多少处理多少。

 添加第2类“时间阈值批处理”,主要是为了防止消息较少时,数量迟迟达不到阈值导致消息堆积时间过长;同时也是为了防止最后一批消息因为数量达不到阈值而不能被处理。
 所以我是同时使用上面两个批处理;因为大部分时候数据量很大,所以基本是“数量阈值批处理”在工作;定时器只是个捡漏的。

问题日志

  在redis的pub/sub模式模式下,定时器线程(定时批处理)和主线程(数量批处理)合作非常愉快,但同样的处理方式,在storm里,却出了问题。

Storm错误日志

Anchored onto -8059272174478282595 after ack/fail
2018-08-20 15:55:15.184 o.a.s.t.ShellBolt Thread-24 [ERROR] Halting process: ShellBolt died. Command: [/home/soft/aimatrix/virtualenv/bin/python, /home/soft/aimatrix/tests/timer_storm.py], ProcessInfo pid:26877, name:ittDnsProject exitCode:-1, errorString:
java.lang.RuntimeException: Anchored onto -8059272174478282595 after ack/fail
        at org.apache.storm.task.ShellBolt.handleEmit(ShellBolt.java:231) [storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt.access$1300(ShellBolt.java:70) [storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt$BoltReaderRunnable.run(ShellBolt.java:376) [storm-core-1.1.1.jar:1.1.1]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
2018-08-20 15:55:15.190 o.a.s.d.executor Thread-24 [ERROR]
java.lang.RuntimeException: Anchored onto -8059272174478282595 after ack/fail
        at org.apache.storm.task.ShellBolt.handleEmit(ShellBolt.java:231) [storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt.access$1300(ShellBolt.java:70) [storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt$BoltReaderRunnable.run(ShellBolt.java:376) [storm-core-1.1.1.jar:1.1.1]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]

NoOutputException, Pipe to subprocess seems to be broken! No output read.
2018-08-20 16:22:16.199 o.a.s.t.ShellBolt Thread-26 [ERROR] Halting process: ShellBolt died. Command: [/home/soft/aimatrix/virtualenv/bin/python, /home/soft/aimatrix/aimatrix.py, -M, storm, -m, eta], ProcessInfo pid:16418, name:etaBolt exitCode:143, errorString:(Unable to capture error stream) java.lang.RuntimeException: org.apache.storm.multilang.NoOutputException: Pipe to subprocess seems to be broken! No output read.
Serializer Exception:
(Unable to capture error stream)

        at org.apache.storm.utils.ShellProcess.readShellMsg(ShellProcess.java:127) ~[storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt$BoltReaderRunnable.run(ShellBolt.java:352) [storm-core-1.1.1.jar:1.1.1]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
2018-08-20 16:22:16.200 o.a.s.d.executor Thread-26 [ERROR] 
java.lang.RuntimeException: org.apache.storm.multilang.NoOutputException: Pipe to subprocess seems to be broken! No output read.
Serializer Exception:
(Unable to capture error stream)

        at org.apache.storm.utils.ShellProcess.readShellMsg(ShellProcess.java:127) ~[storm-core-1.1.1.jar:1.1.1]
        at org.apache.storm.task.ShellBolt$BoltReaderRunnable.run(ShellBolt.java:352) [storm-core-1.1.1.jar:1.1.1]
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_60]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值