我们如何通过命令行运行多个kafka消费者?

时间:2017-01-11 21:46:07

标签: apache-kafka

我正在通过他们已经在kafka包中提供的shell脚本测试kafka性能。我创建了一个包含10个分区和抽取数据的主题,如下所示:

./bin/kafka-producer-perf-test.sh --topic test-topic --num-records 9000000 --record-size 300 --throughput 250000 --producer-props bootstrap.servers=110.17.14.302:9092 acks=1 max.in.flight.requests.per.connection=1 batch.size=5000

现在我想从多个消费者那里消费上面所示的数据,而不仅仅是单个消费者。所以我开始使用kafka-consumer-perf-test.sh。这就是我在做的事情:

./bin/kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test-topic --group test1

我们是否可以通过命令行在单个使用者组中运行多个kafka使用者,并且使用kafka-consumer-perf-test.sh在不同分区上工作的每个使用者?我正在使用Kafka版本0.10.1.0

我看到了这个so post,但它没有说明在哪里配置我们想要运行的消费者以及他们将使用哪个分区?

更新

这是我看到的错误:

./bin/kafka-consumer-perf-test.sh --zookeeper 110.27.14.10:2181 --messages 50 --topic test-topic --threads 1

[2017-01-11 22:34:09,785] WARN [ConsumerFetcherThread-perf-consumer-14195_kafka-cluster-3098529006-zeidk-1484174043509-46a51434-2-0], Error in fetch kafka.consumer.ConsumerFetcherThread$FetchRequest@54fb48b6 (kafka.consumer.ConsumerFetcherThread)
java.lang.OutOfMemoryError: Java heap space
        at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:57)
        at java.nio.ByteBuffer.allocate(ByteBuffer.java:335)
        at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel(NetworkReceive.java:93)
        at kafka.network.BlockingChannel.readCompletely(BlockingChannel.scala:129)
        at kafka.network.BlockingChannel.receive(BlockingChannel.scala:120)
        at kafka.consumer.SimpleConsumer.liftedTree1$1(SimpleConsumer.scala:99)
        at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:83)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SimpleConsumer.scala:132)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:132)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:132)
        at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply$mcV$sp(SimpleConsumer.scala:131)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:131)
        at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:131)
        at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
        at kafka.consumer.SimpleConsumer.fetch(SimpleConsumer.scala:130)
        at kafka.consumer.ConsumerFetcherThread.fetch(ConsumerFetcherThread.scala:109)
        at kafka.consumer.ConsumerFetcherThread.fetch(ConsumerFetcherThread.scala:29)
        at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:118)
        at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:103)
        at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)

1 个答案:

答案 0 :(得分:1)

只需在不同的控制台中多次运行相同的命令(即=SUMPRODUCT(NOT(ISERROR(MATCH($C:$C;J:J;0)))*($B:$B<$L$1);$D:$D) )。

关于分区分配:Kafka将自动为您执行此操作。如果您使用消费者群体。

如果要进行手动分区分配,则无法使用使用者组。为此,你不能使用kafka-consumer-perf-test.sh但需要自己编写。

在此处阅读JavaDoc:https://kafka.apache.org/0101/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html