卡夫卡鲸鱼喷水表现不佳

时间:2016-03-01 13:52:12

标签: apache-kafka apache-storm

我正在测试简单拓扑以检查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中得到的: Perfomance test 1

哦,我在10分钟内获得了1.5kk元组。螺栓容量约为0.5。所以我的逻辑很简单:如果我用双重喷口和螺栓平行度提示 - 我将获得双重性能。 接下来的测试是1名工人2 Kafka Spout,2名简单Acker Bolt和topology.acker.executors = 2。结果如下:

Perfomance test 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平行度提示甚至更有帮助。

1 个答案:

答案 0 :(得分:0)

因此,您似乎已经达到了对一名工人的表现的限制。你只是给一个工人做很多工作,而且无法处理所有工作。

此时如果您想进一步提高系统性能,您有两种选择。

  1. 添加更多工作人员。
  2. 提高一个员工的工作能力。
  3. 如果您不想添加更多工作人员,那么您需要配置一名工作人员。然后,您应该调查一个工作程序的配置,以便为其提供更多内存,更多cpu等。您应该查看Storm的default configuration options并查看是否调整某些配置值可以提供更好的性能。一些似乎比其他人更有帮助的配置:

    worker.heap.memory.mb:
    worker.childopts:
    supervisor.childopts:
    supervisor.memory.capacity.mb:
    supervisor.cpu.capacity: