Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡滔滔不绝地说糟糕的表演_Apache Kafka_Apache Storm - Fatal编程技术网

Apache kafka 卡夫卡滔滔不绝地说糟糕的表演

Apache kafka 卡夫卡滔滔不绝地说糟糕的表演,apache-kafka,apache-storm,Apache Kafka,Apache Storm,我正在测试简单拓扑以检查卡夫卡喷口的性能。 它包含卡夫卡喷口和螺栓,确认每个元组。 螺栓执行方法: public void execute(元组输入){ collector.ack(输入); } 拓扑结构如下所示: 受保护的无效配置拓扑(TopologyBuilder TopologyBuilder){ 配置Kafkacdr喷口(拓扑生成器); 配置KafkaspoutBandwidthTesterBolt(拓扑构建器); } 专用void配置KafkacdrSpout(拓扑生成器生成器){

我正在测试简单拓扑以检查卡夫卡喷口的性能。 它包含卡夫卡喷口和螺栓,确认每个元组。 螺栓执行方法:

public void execute(元组输入){
collector.ack(输入);
}
拓扑结构如下所示:

受保护的无效配置拓扑(TopologyBuilder TopologyBuilder){
配置Kafkacdr喷口(拓扑生成器);
配置KafkaspoutBandwidthTesterBolt(拓扑构建器);
}
专用void配置KafkacdrSpout(拓扑生成器生成器){
KafkaSpout KafkaSpout=新的KafkaSpout(createkafkacdrpoutconfig());
int-spoutCount=Integer.valueOf(topologyConfig.getProperty(“kafka.cboss.cdr.spout.thread.count”);
建筑商设置管道(卡夫卡CDR管道ID、卡夫卡管道输出、管道计数)
.setNumTasks(Integer.valueOf(topologyConfig.getProperty(KAFKA\u CDR\u SPOUT\u NUM\u TASKS));
}
private SpoutConfig CreateKafkacDr SpoutConfig()的{
BrokerHosts hosts=newzkhosts(topologyConfig.getProperty(“kafka.zookeeper.broker.host”);
字符串topic=topologyConfig.getProperty(“kafka.cboss.cdr.topic”);
字符串zkRoot=topologyConfig.getProperty(“kafka.cboss.cdr.zkRoot”);
字符串consumerGroupId=topologyConfig.getProperty(“kafka.cboss.cdr.consumerId”);
SpoutConfig kafkaSpoutConfig=新的SpoutConfig(主机、主题、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”);
返回kafkaSpoutConfig;
}
public void配置KafkaspoutBandwidthTesterBolt(TopologyBuilder TopologyBuilder){
SimpleAckerBolt b=新SimpleAckerBolt();
topologyBuilder.setBolt(喷口\u带宽\u测试仪\u螺栓\u ID,b,Integer.valueOf(topologyConfig.getProperty(CFG\u简单\u ACKER\u螺栓\u并行性)))
.setNumTasks(Integer.valueOf(拓扑配置.getProperty(喷动\u带宽\u测试仪\u螺栓\u数量\u任务)))
.LocalOrshufflegroup(卡夫卡CDR喷口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
我用一个工人、一个卡夫卡喷口和一个简单的阿克螺栓来启动我的拓扑。 这就是我在storm UI中得到的:

好的,我在10分钟内得到了1.5kk元组。螺栓能力约为0.5。所以,我的逻辑很简单:如果我双喷双喷,我将获得双倍的性能。 下一个测试是使用1个工人2个卡夫卡喷口,2个简单的阿克螺栓和拓扑。阿克。执行器=2。结果如下:

因此,随着parallelizm提示的增加,我的性能会变得更差。为什么会这样?如何增加每秒处理的元组数?实际上,喷口平行度提示大于2的任何测试显示的结果都比1个喷口执行器差

我已经检查过:
1) 这不是卡夫卡的错。主题在2个代理上有20个分区。在4个工人规模上进行拓扑,并获得x4性能。
2) 这不是服务器故障。服务器有40个内核和32Gb RAM。在运行拓扑时,它消耗大约1/8 CPU,几乎没有RAM。
3) 更改topology.max.spout.pending参数没有帮助。

4) 增加Bolt或Acker并行性提示甚至更多都没有帮助。

因此,似乎一个工人的绩效达到了极限。你只是给了一个员工很多事情要做,而它无法处理所有的事情

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

  • 增加更多的工人
  • 提高您的“一个员工”执行工作的能力
  • 如果您不想添加更多的worker,那么剩下的就是配置一个worker。然后,您应该调查一个worker的配置,以便为它提供更多内存、更多cpu等。您可能应该查看风暴,看看调整一些配置值是否能提高性能。有些配置似乎比其他配置更有帮助:

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

    因此,你的一名员工的表现似乎达到了极限。你只是给了一个员工很多事情要做,而它无法处理所有的事情

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

  • 增加更多的工人
  • 提高您的“一个员工”执行工作的能力
  • 如果您不想添加更多的worker,那么剩下的就是配置一个worker。然后,您应该调查一个worker的配置,以便为它提供更多内存、更多cpu等。您可能应该查看风暴,看看调整一些配置值是否能提高性能。有些配置似乎比其他配置更有帮助:

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

    您只使用一个worker运行了两个测试,如果添加了另一个worker呢?因此,请与两名员工一起进行第二次测试。谢谢您的回复,摩根。你说得对。工人数量的增加给了我成比例的结果。有了2个工人和2个喷口,我的元组每秒增加了一倍。但这个想法是为了测试一个工人的最佳表现。我能得到的最好结果是每10分钟1.5kk元组,或者每秒2500元组。我想在拥有40个内核、32GB RAM和10Gb/s网络的节点上,我可以做得更好。1个工人,但40个内核并没有真正意义。无论如何,每个工作线程都是一个线程,因此这意味着您的服务器有能力承载40个工作线程。您现在在单核心服务器上的性能完全相同。每个线程2500个元组/秒并不算太好,但也不算太坏。所以没有理由在一个节点上运行多个worker。@f1sherox,我不一定同意这种说法。运行多个worker的一个原因是为了提高容错能力。如果您只有一个辅助进程,如果这一个辅助进程失败,则整个拓扑将失败。如果您有6个工作进程,但有1个工作进程失败,则有5个工作进程仍在运行。此外,一个辅助进程只能属于一个拓扑,因此只有h