先说结论:storm里,不能在python脚本中添加读取消息的定时任务。
问题描述
问题来源
在一个消息消费场景里,需要从redis(pub/sub模式)或者storm中接收消息,然后进行批量处理。 说明下,redis和storm并不同时共存,程序会根据系统环境和配置选择不同的数据源,但消息处理方式是一致的。
批量处理主要分为两类:
- 数量阈值批处理,即消息数量达到设定的阈值,开始进行批处理;
- 时间阈值批处理,即使用定时器,定期批量处理消息,有多少处理多少。
添加第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]