如何在Apache Storm中以编程方式为拓扑重新启动worker

时间:2018-10-13 09:31:01

标签: java apache-storm

我在Apache Storm中面临问题

问题场景

  1. 当将Small数据发送到Storm时,数据将按拓扑正确处理(只有1个工作线程),并提供更多空间以保留在MongoDB中。
  2. 但是,当数据量巨大时,它将处理数据并保留在DB中,但之后无论数据大小,都将不接受任何其他数据。

当前解决方法

我们从Storm UI重新启动worker。

问题

我们可以以编程方式重新启动拓扑工作器吗?

2 个答案:

答案 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共享的链接应该足以理解该机制,无论如何,如果您想深入了解实现,我会添加此链接: