我想知道它们之间的区别,以及它们如何相互关联,以及“锚定元组”和“acker任务”的作用是什么。如果可能,请提供详细的说明和示例。我已经阅读了官方文档和一些相关文章,但我对这个主题的理解还不清楚。
答案 0 :(得分:10)
StreamID :默认情况下,有一个名为default
的(逻辑)流。在一些用例中,有必要,没有单个(逻辑)流而是多个(每个流中具有不同的数据)。为此,您可以声明其他流并为其分配ID(即名称)以区分它们(这在declareOutputFields(...)
方法中完成)。将拓扑“插入”时,默认情况下,始终分配给默认流(作为输入流),但您也可以指定要明确接收的流的名称。
<强>的TaskID 即可。每个Spout / Bolt都有一个指定的并行度(即并行度dop
)。因此,每个Spout / Bolt都在多个任务中执行,每个任务都会获得一个ID,以便区分它们。
MessageID :如果您想使用容错机制,则需要为Spouts发出的每个元组分配一个唯一的ID。
Acker任务:这些用于处理来自您的螺栓的ack
消息(即,当您致电collector.ack(...)
或{{1}时,系统发送的消息})跟踪元组是成功处理还是失败。你通常不需要关心它们。
锚定:锚定是一种告诉Storm的机制,哪些输入元组用于产生哪些输出元组。如果你有一个Bolt,它将一个句子分成单词并且每个单词发出一个元组,你可以将所有单词锚定到同一个句子。 (如果单词元组失败,Storm知道它需要回复句子元组,以便可以恢复丢失的元组)。另一方面,如果你聚合让我们说最后5个输入元组来计算平均值,你将缓冲所有5个输入元组,直到你发出平均元组并使用所有5个输入元组作为这个单个平均输出元组的锚点。 (同样,如果输出元组丢失,Storm知道它需要回复所有5个输入元组,以便可以重新计算丢失的平均元组)。请注意,您不能使用元组作为锚点,已经对Storm有所帮助。因此,您需要延迟对输入元组进行处理,直到它不再需要作为锚元组。