我正在使用Apache Beam(数据流)来处理存储在Kafka中的消息。 Kafka由3个经纪人组成。每个主题包含仅1个分区。 (这意味着1个主题在一个消费者群体中只能有1个消费者)。我们正在使用Kafka.IO从Kafka中读取内容。 (当前,我们无法重新划分主题)
当其中一个主题有大量积压订单时,我遇到了吞吐量问题。 总而言之,我进行了各种测试,与独立的Kafka客户端相比,我在Apache Beam管道中获得了1/3的吞吐量。即使Dataflow可以扩展到X台机器。
看起来,从Kafka读取消息后,消息将始终在同一台计算机上进行处理,并且缓慢的流水线通常会对吞吐量产生影响。我说的对吗?
从KafkaIO阅读后,我尝试使用:.apply("Materialize input", Reshuffle.viaRandomKey())
。如建议的here。这样一来,机器的扩展就会产生影响,但是CPU利用率变得疯狂了,我需要使用功能更强大的机器。
还有其他想法如何提高吞吐量?
我的KafkaIO配置:
PCollection<KafkaRecord<String, String>> readLines = p
.apply("Read from Kafka",
KafkaIO.<String, String>read()
.withBootstrapServers("10.150.0.17:9092")
.withTopics(topics)
.withKeyDeserializer(KeyDeserializer.class)
.withValueDeserializer(ValueDeserializer.class)
.updateConsumerProperties(
new ImmutableMap.Builder<String, Object>()
.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
"earliest")
.put(ConsumerConfig.RECEIVE_BUFFER_CONFIG, 524288)
.put(ConsumerConfig.SEND_BUFFER_CONFIG, 524288)
.put(ConsumerConfig.GROUP_ID_CONFIG, "my-consumer-group")
.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false)
.put(KafkaAvroDeserializerConfig.SCHEMA_REGISTRY_URL_CONFIG,
"http://10.150.0.17:8081")
.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG, false)
.build()
)
.commitOffsetsInFinalize());