风暴支持批处理类处理

时间:2014-08-21 20:27:07

标签: apache-storm

我需要使用Storm处理批量元组。我的最后一个螺栓必须等到拓扑接收到整个批次,然后才能进行一些处理。为了避免混淆 - 我的批处理是一组实时发送的N消息,并且该术语不必与批处理(Hadoop)连接。即使是2条消息也可以批量生效。

阅读Storm的文档是否可以肯定地说Storm并不支持这种批处理(批量=实时N条消息)?

我知道我们有Trident,但我没有使用它,但我确实测试了一下。 batchSpout概念确实是我正在寻找的,因为您可以使用收集器进行批处理,而spout将作为单个批处理发出消息。但除了Trident之外,普通风暴提供了什么?

我是如何解决这个问题的方法是使用元组确认和一些超时黑客攻击(也许它们不是黑客攻击?)。作为消息代理,我使用了RabbitMQ,我制作了一个spout,它从队列中获取消息并将它们作为元组发送到下游,直到队列中不再有消息为止。这些元组通过几个阶段(3-4个阶段,也就是螺栓),当它们到达最后一个螺栓时,它们停在那里。我需要阻止它们(不发出任何东西),因为正如我所说,最后一个螺栓需要处理整个批次的结果,然后只发出一个元组(最终产生的元组)。那么它如何知道它何时应该处理?我让喷口负责信号化。当喷口没有任何元组发射时,它会睡10毫秒。因此,在它休眠之后,让我们说,1000毫秒它进入READY状态(它准备发出END-OF-BATCH或TIME-OUT信号)。但需要满足另一个条件。我无法发送信号,直到我确定所有元组都到达最后一个螺栓。所以我使用了元组确认来跟踪这一点。当元组到达最后一个螺栓时,它会被激活。当所有元组都被激活时,当喷口超时时,喷口发出信号,最后一个螺栓现在很高兴它可以处理那批元组的结果。

所以我的问题是,亲爱的风暴大师,这个拓扑设计很糟糕,它看起来像某种黑客?有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Storm还提供了https://storm.incubator.apache.org/documentation/Transactional-topologies.html。尽管它们被弃用以支持Trident,但它们是在标准风暴螺栓/喷口上实施的,因此没有理由不能继续使用它们。您还可以考虑将您的流程拆分为两种拓扑,其中第二种拓扑等待,直到在RabbitMQ中处理N条消息

答案 1 :(得分:0)

我的实现是替换storm.trident.planner.processor.EachProcessor并创建一个扩展原始Function的新BatchBoundaryFunction接口,因此我可以公开EachProcessor的startBatch& amp; finishBatch方法,可以准确知道一批元组何时开始以及何时完成元组批处理。

{{1}}
相关问题