我正在测试简单拓扑以检查kafka spout性能。 它包含承认每个元组的kafka spout和Bolt。 螺栓执行方法:
public void execute(Tuple input) {
collector.ack(input);
}
拓扑看起来像这样:
protected void configureTopology(TopologyBuilder topologyBuilder) {
configureKafkaCDRSpout(topologyBuilder);
configureKafkaSpoutBandwidthTesterBolt(topologyBuilder);
}
private void configureKafkaCDRSpout(TopologyBuilder builder) {
KafkaSpout kafkaSpout = new KafkaSpout(createKafkaCDRSpoutConfig());
int spoutCount = Integer.valueOf(topologyConfig.getProperty("kafka.cboss.cdr.spout.thread.count"));
builder.setSpout(KAFKA_CDR_SPOUT_ID, kafkaSpout, spoutCount)
.setNumTasks(Integer.valueOf(topologyConfig.getProperty(KAFKA_CDR_SPOUT_NUM_TASKS)));
}
private SpoutConfig createKafkaCDRSpoutConfig() {
BrokerHosts hosts = new ZkHosts(topologyConfig.getProperty("kafka.zookeeper.broker.host"));
String topic = topologyConfig.getProperty("kafka.cboss.cdr.topic");
String zkRoot = topologyConfig.getProperty("kafka.cboss.cdr.zkRoot");
String consumerGroupId = topologyConfig.getProperty("kafka.cboss.cdr.consumerId");
SpoutConfig kafkaSpoutConfig = new SpoutConfig(hosts, topic, zkRoot, consumerGroupId);
kafkaSpoutConfig.scheme = new SchemeAsMultiScheme(new CbossCdrScheme());
kafkaSpoutConfig.ignoreZkOffsets = true;
kafkaSpoutConfig.fetchSizeBytes = Integer.valueOf(topologyConfig.getProperty("kafka.fetchSizeBytes"));
kafkaSpoutConfig.bufferSizeBytes = Integer.valueOf(topologyConfig.getProperty("kafka.bufferSizeBytes"));
return kafkaSpoutConfig;
}
public void configureKafkaSpoutBandwidthTesterBolt(TopologyBuilder topologyBuilder) {
SimpleAckerBolt b = new SimpleAckerBolt();
topologyBuilder.setBolt(SPOUT_BANDWIDTH_TESTER_BOLT_ID, b, Integer.valueOf(topologyConfig.getProperty(CFG_SIMPLE_ACKER_BOLT_PARALLELISM)))
.setNumTasks(Integer.valueOf(topologyConfig.getProperty(SPOUT_BANDWIDTH_TESTER_BOLT_NUM_TASKS)))
.localOrShuffleGrouping(KAFKA_CDR_SPOUT_ID);
}
其他拓扑设置:
topology.max.spout.pending=250
topology.executor.receive.buffer.size=1024
topology.executor.send.buffer.size=1024
topology.receiver.buffer.size=8
topology.transfer.buffer.size=1024
topology.acker.executors=1
我用1名工人1 Kafka Spout和1个简单的Acker Bolt启动我的拓扑。 这就是我在风暴UI中得到的:
哦,我在10分钟内获得了1.5kk元组。螺栓容量约为0.5。所以我的逻辑很简单:如果我用双重喷口和螺栓平行度提示 - 我将获得双重性能。 接下来的测试是1名工人2 Kafka Spout,2名简单Acker Bolt和topology.acker.executors = 2。结果如下:因此,随着parallelizm提示的增加,我的性能会更差。它为什么会发生?如何增加每秒处理的元组数? Actualy任何喷口平行度提示大于2的测试都显示出比1喷口执行器更差的结果。
我已经检查过:
1)这不是卡夫卡故障。主题在2个经纪商上有20个分区。 4个工人的拓扑结构并获得x4性能。
2)它不是服务器故障。服务器有40个内核和32Gb RAM。在运行拓扑时,它消耗大约1/8 CPU,几乎没有RAM
3)更改topology.max.spout.pending参数没有帮助
4)增加螺栓或Acker平行度提示甚至更有帮助。
答案 0 :(得分:0)
因此,您似乎已经达到了对一名工人的表现的限制。你只是给一个工人做很多工作,而且无法处理所有工作。
此时如果您想进一步提高系统性能,您有两种选择。
如果您不想添加更多工作人员,那么您需要配置一名工作人员。然后,您应该调查一个工作程序的配置,以便为其提供更多内存,更多cpu等。您应该查看Storm的default configuration options并查看是否调整某些配置值可以提供更好的性能。一些似乎比其他人更有帮助的配置:
worker.heap.memory.mb:
worker.childopts:
supervisor.childopts:
supervisor.memory.capacity.mb:
supervisor.cpu.capacity: