如何设置TOPOLOGY_MAX_SPOUT_PENDING参数

时间:2015-09-27 20:21:01

标签: java apache-kafka apache-storm

在我的拓扑中,我从Kafka队列中读取触发器消息。收到触发消息后,我需要向螺栓发出大约4096条消息。在螺栓中,经过一些处理后,它将发布到另一个Kafka队列(另一个拓扑将在以后使用它)。

我正在尝试设置TOPOLOGY_MAX_SPOUT_PENDING参数来限制要去的消息数量。但我发现它没有效果。是因为我用一个nextTuple()方法发出所有元组?如果是这样,那应该是什么工作?

2 个答案:

答案 0 :(得分:2)

如果您正在阅读kafka,那么您应该使用充满风暴的KafkaSpout。不要试图实现自己的鲸鱼喷水,相信我,我在生产中使用KafkaSpout,它的工作非常顺利。每个Kafka消息都只生成一个元组。

正如您在this nice page from the manual上看到的那样,您可以像这样设置topology.max.spout.pending

Config conf = new Config();
conf.setMaxSpoutPending(5000);
StormSubmitter.submitTopology("mytopology", conf, topology);

每个喷口设置topology.max.spout.pending,如果你有四个喷口,你的拓扑结构中最多有非完整元组,等于喷口数* topology.max.spout.pending。

另一个提示是,您应该使用风暴UI来查看topology.max.spout.pending是否设置正确。

请记住,topology.max.spout.pending只是拓扑中未处理的元组数,拓扑永远不会停止消耗来自kafka的消息,至少在生产系统上消息...如果你想消耗4096批次你需要在你的螺栓上实现缓存逻辑,或使用除风暴之外的其他东西(微批量导向)。

答案 1 :(得分:1)

要进行TOPOLOGY_MAX_SPOUT_PENDING,您需要启用容错机制(即,在Spouts中分配消息ID,在锚点中分配锚点和确认)。此外,如果每次调用Spout.nextTuple()时发出多个元组,则TOPOLOGY_MAX_SPOUT_PENDING将无法正常工作。

由于某些原因,这实际上是不好的做法,因此每Spout.nextTuple()次调用会发出多个元组(有关详情,请参阅Why should I not loop or block in Spout.nextTuple())。