我在Apache Storm中面临问题
问题场景:
当前解决方法:
我们从Storm UI重新启动worker。
问题:
我们可以以编程方式重新启动拓扑工作器吗?
答案 0 :(得分:0)
暴风雨有两种螺栓类型:IRichBolt和IBasicBolt。如果实现IBasicBolt,则也应实现Acknowledge。另外,您还应将Ack插入螺栓中以防止锁定。这些链接很好:
http://storm.apache.org/releases/1.0.6/Concepts.html http://storm.apache.org/releases/1.2.2/Guaranteeing-message-processing.html
答案 1 :(得分:0)
重启工作人员永远不是一个好的解决方案,因为可能会丢失一些元组。最佳实践是利用Rahim回答的Storm消息可靠性功能。
但是,除了消息可靠性风暴具有内部反压机制之外,这意味着当Spouts注入的数据量超过Bolts能够处理的数据量时,Spout会自动变慢。
要启用此功能,首先需要像Rahim所说的那样启用确认。这意味着如果您的拓扑结构很简单:
喷口->螺栓
喷口将:
public void nextTuple(){
...
_collector.emit(new Values(tuple), tupleId);
}
@Override
publci void ack(Object msgId) { super.ack(msgId); }
其中tupleId仅是增量计数器count++
。这样,您就向Storm声明了等待确认的新元组。
同时使用连续螺栓和拓扑中的所有连续螺栓,或者至少直到引起瓶颈的螺栓为止,您将这样写:
public void execute(Tuple tuple){
...
_collector.emit(tuple, new Values(newTuple));
_collector.ack(tuple);
}
通过这种方式,您将注意到Storm,元组已被完全处理。
最后但并非最后一个,在声明拓扑生成器的main方法中,您必须定义Spout将等待的最大元组数:
Config conf = new Config();
conf.setMaxSpoutPending(100);
这样,Spout将开始生成新的元组,等待它们被确认,如果(在这种情况下)未决元组的数量超过100,则Spout将停止调用nextTuple方法,等待它们被确认,然后生成新的。
N.B .:值100仅是一个示例,您可能需要对其稍加调整以使其最适合您的情况。
Rahim共享的链接应该足以理解该机制,无论如何,如果您想深入了解实现,我会添加此链接: