Dataflow中的Apache Beam / KafkaIO吞吐量问题

时间:2019-08-29 15:31:00

标签: apache-kafka google-cloud-dataflow apache-beam

我正在使用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());

0 个答案:

没有答案