Apache Storm Kafka喷口滞后问题

时间:2018-10-09 18:58:59

标签: java spring apache-kafka apache-storm apache-storm-topology

我正在使用Storm 1.1.2和Kafka 0.11构建Java Spring应用程序,并将其在Docker容器中启动。

拓扑中的所有内容都按计划工作,但是在卡夫卡(Kafka)的高负载下,卡夫卡的滞后随着时间的推移而越来越大。

我的KafkaSpoutConfig:

 KafkaSpoutConfig<String,String> spoutConf = 
     KafkaSpoutConfig.builder("kafkaContainerName:9092", "myTopic")
     .setProp(ConsumerConfig.GROUP_ID_CONFIG, "myGroup")
     .setProp(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, MyObjectDeserializer.class)
     .build()

然后我的拓扑如下

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout("stormKafkaSpout", new KafkaSpout<String,String>(spoutConf), 25);

builder.setBolt("routerBolt", new RouterBolt(),25).shuffleGrouping("stormKafkaSpout");

Config conf = new Config();
conf.setNumWorkers(10);
conf.put(Config.STORM_ZOOKEEPER_SERVERS, ImmutableList.of("zookeeper"));
conf.put(Config.STORM_ZOOKEEPER_PORT, 2181);

conf.put(Config.NIMBUS_SEEDS, ImmutableList.of("nimbus"));
conf.put(Config.NIMBUS_THRIFT_PORT, 6627);

System.setProperty("storm.jar", "/opt/storm.jar");

StormSubmitter.submitTopology("topologyId", conf, builder.createTopology());

RouterBolt(扩展了BaseRichBolt)执行一个非常简单的switch语句,然后使用本地KafkaProducer对象将新消息发送到另一个主题。就像我说的那样,所有内容都可以编译并且拓扑按预期运行,但是在高负载(3000消息/秒)下,Kafka滞后正好堆积起来,等同于拓扑的低吞吐量。

我尝试禁用acking

conf.setNumAckers(0);

conf.put(Config.TOPOLGY_ACKER_EXECUTORS, 0);

但是我想这不是一个令人担忧的问题。

我在Storm UI上看到RouterBolt在高负载下的执行延迟为1.2毫秒,处理延迟为.03毫秒,这让我相信Spout是瓶颈,而且并行提示是25,因为有“ myTopic”的25个分区。谢谢!

1 个答案:

答案 0 :(得分:2)

您可能会受到https://issues.apache.org/jira/browse/STORM-3102的影响,这会导致喷口在每次发射时进行非常昂贵的通话。请尝试升级到固定版本之一。

编辑:该修复程序尚未真正发布。您可能仍想通过使用以下方法从源代码构建喷口来尝试修复此问题https://github.com/apache/storm/tree/1.1.x-branch来构建1.1.4快照。