at least once
checkpoint,只能保证恢复到最近一次的状态,但是fail的tuple不能重发,如果不编写spout的ack和fail方法的话。
第一种:redis缓存map,ack删除,fail重发。重发的时候,出现乱序发送。
第二种:封装好的kafkaspout,知道at least once机制,但是速率不知道如何控制
kafkaspout
kafka poll的速率控制,就看到一个maxpoll,设置无用,得研究kafkaspout源码,
每次都是poll一大批,导致状态运算不正确
org.apache.storm.generated.InvalidTopologyException
错误原因:上游的声明和下游的处理不匹配
解决:查看上下游的shuffleGrouping("XXX"),
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("sentence"));
}
还有上游如果是按STREAM id输出,那么下游直接shuffleGrouping("XXX"),也会出错,因为不知道是分配哪个ID的流。
多线程的问题
共享的全局变量使用static来保护?
但是这个问题里好像不对:https://stackoverflow.com/questions/40861308/is-it-possible-to-use-global-static-variables-in-storm-bolts-spout-in-actual-clu
测试全局变量和并行度,集群模式的关系
-
bolt内不加static,3并行度,单机模式
结果: image.png
测试bolt中全局变量i,在execute中执行打印i,然后i++
分析:每个bolt实例维护自己的全局变量i。 -
bolt内加static,3并行度,单机模式
结果: image.png
测试bolt中全局变量i,在execute中执行打印i,然后i++
分析:每个bolt实例共同维护享受static全局变量i。
原因:同一个机器在同一个jvm中,只有一个static。 -
bolt内加static,3并行度,集群模式
结果: image.png
测试bolt中全局变量i,在execute中执行打印i,然后i++
分析:每个bolt实例维护自己的全局变量i。
原因:不同一个机器在不同一个jvm中,各自都有static。
-
WordCountTestTopology加static的public变量,3并行度,本地模式
结果: image.png
测试bolt中使用该WordCountTestTopology.i,在execute中执行打印i,然后i++
分析:每个bolt实例共同维护享受static全局变量i。
原因:同一个机器在同一个jvm中,只有一个static。 -
WordCountTestTopology加static的public变量,3并行度,集群模式
结果: image.png
测试bolt中使用该WordCountTestTopology.i,在execute中执行打印i,然后i++
分析:每个bolt实例维护自己的全局变量i。
原因:不同一个机器在不同一个jvm中,各自都有static。
stackoverflow的解决建议:
Is it possible to use Global Static variables in Storm Bolts/Spout in actual cluster environment
image.png想法:可以用allgrouping来给每个task传播tuple来更新维护共同的变量,allgrouping, 一般用于全局的数据同步和共享才需要, 比如全局的配置更新等,
知乎:
storm处理流数据如何不断的更新与查询?
报错
2018-11-21 14:13:20.580 o.a.s.m.n.StormClientHandler client-boss-1 [INFO] Connection to centos7-dase-75/10.11.6.75:6700 failed:
java.net.NoRouteToHostException: No route to host
解决:查看对应节点的防火墙状态,sudo firewall-cmd --state
,发现正在运行,则关闭直接关闭防火墙 1.systemctl stop firewalld.service #停止firewall 2.systemctl disable firewalld.service #禁止firewall开机启动
Log日记里记录了每条tuple的信息,导致log日记过大
原因:配置了config的debug为true,默认是false,修改为false则不会记录每条tuple消息了。myconf.setDebug(false);
spout大量超时failed信息
得考虑输入速率,bolt的并行度,窗口大小导致缓冲很多积累很多tuple,bolt的capacity处理能力,spout pending,ack数量
网友评论