我正在使用 kafka-storm 连接 kafka 和 Storm。我有3台服务器运行zookeeper、kafka和storm。 kafka中有一个主题“test”,有9个分区。
在storm拓扑中,KafkaSpout执行器的数量为9,默认情况下任务的数量也应为9。 “extract”bolt 是唯一连接到 KafkaSpout(“log”spout)的bolt。
从UI来看,spout的故障率很高。但是,bolt 中执行的消息数 = 发出的消息数 - Bolt 中失败的消息数。当失败消息一开始为空时,这个方程几乎匹配。
根据我的理解,这意味着 Bolt 确实收到了来自 spout 的消息,但 ack 信号在飞行中暂停。这就是为什么 spout 中的 ack 数量如此之少的原因。
这个问题可以通过增加超时秒数和 spout 挂起消息数来解决。但这会导致更多的内存使用,我无法将其增加到无限。
我在想是否有一种方法可以强制storm忽略某些spout/bolt中的ack,这样它就不会等待该信号直到超时。这应该会显着增加吞吐量,但不能保证消息处理。
如果你将acks的数量设置为0,那么storm将自动ack每个样本。
config.setNumAckers(0);
请注意,UI 仅测量和显示 5% 的数据流。
除非你设置
config.setStatsSampleRate(1.0d);
尝试增加螺栓的超时时间并减少topology.max.spout.pending
.
另外,请确保 spout 的 nextTuple() 方法是非阻塞且经过优化的。
我还建议对代码进行分析,也许您的风暴队列已满,您需要增加它们的大小。
config.put(Config.TOPOLOGY_TRANSFER_BUFFER_SIZE,32);
config.put(Config.TOPOLOGY_EXECUTOR_RECEIVE_BUFFER_SIZE,16384);
config.put(Config.TOPOLOGY_EXECUTOR_SEND_BUFFER_SIZE,16384);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)