我使用的是storm-kafka-client 1.1.1和storm-core 1.1.0。
我已经调整了以下参数,但无法启用背压并降低kafka-spout的摄入率。
每秒消耗 2000 消息。
下游Bolt需要 50 ms 来处理一条消息,即每秒处理20条消息。
spout发出的元组和bolt执行的元组之间的延迟随着时间的推移而增加。
**如何让Spout读取每秒20条消息并保持其消耗率与Bolt的执行率相同**
**Topology**
topology.max.spout.pending= **5** ,
topology.message.timeout.secs= **600** ,
topology.executor.send.buffer.size=**64** ,
topology.executor.receive.buffer.size=**64** ,
topology.transfer.buffer.size=**64**
**KafkaSpoutConfig**
setPollTimeoutMs(**200**) ,
setFirstPollOffsetStrategy(latest) ,
setMaxUncommittedOffsets(**2_000_000**) ,
setGroupId(groupName) ,
setProp("fetch.max.wait.ms",**1000**) ,
setProp("max.poll.records", **100**) ,
setMaxPartitionFectchBytes(**512**) ,
setProp("send.buffer.bytes", **512**) ,
setProp("receive.buffer.bytes", **512**) ,
setPartitionRefreshPeriodMs(30_000).setProp("enable.auto.commit", "true") ,
setProp("session.timeout.ms", "**60000**") ,
KafkaSpoutRetryExponentialBackoff.TimeInterval.microSeconds(**50**) ,
KafkaSpoutRetryExponentialBackoff.TimeInterval.milliSeconds(**5**) , 1 ,
KafkaSpoutRetryExponentialBackoff.TimeInterval.seconds(**1**) ) ;
我不确定应为 TOPOLOGY_SPOUT_WAIT_STRATEGY 和 BACKPRESSURE_DISRUPTOR_HIGH_WATERMARK
设置哪些值那么上述参数和值的组合有助于控制鲸鱼喷口的摄取率吗?
任何建议都将受到高度赞赏。
由于 卡尼斯卡
答案 0 :(得分:2)
TOPOLOGY_SPOUT_WAIT_STRATEGY仅在要求喷口发出新元组时使用,并且它不会发出任何内容(即,如果没有新消息)。它不应该对背压产生任何影响。
我对目前的背压实施并不太熟悉,但我非常确定您需要使用TOPOLOGY_BACKPRESSURE_ENABLE明确启用它。
BACKPRESSURE_DISRUPTOR_HIGH_WATERMARK是一个比率,因此,如果您将其设置为例如0.9当螺栓的输入队列满90%时,它会对喷口进行节流。您可以在https://github.com/apache/storm/blob/1.1.x-branch/storm-core/src/jvm/org/apache/storm/Config.java中找到设置文档,在https://github.com/apache/storm/blob/1.1.x-branch/conf/defaults.yaml
找到默认值为了避免一次发出过多的元组,我认为你应该将topology.max.spout.pending设置为一些合理数量的元组(可能是几百个?)。确保将拓扑设置为启用acking(即将topology.enable.message.timeouts设置为true)。否则,max spout pending无效。
不确定为什么要更改执行程序缓冲区大小。
您还应该考虑将Storm和storm-kafka-client升级到至少1.1.2。最近对storm-kafka-client进行了很多修复,如果升级,你可能会更容易使用它。
我不确定代码中的星号是什么意思?