将 Dstream 中的分区数增加到大于直接方法中的 Kafka 分区数

Increase number of partitions in Dstream to be greater then Kafka partitions in Direct approach

根据直接方法,它们是 32 个 Kafka 分区和 32 个消费者。 但是 32 个消费者的数据处理速度比 Kafka 速率慢(1.5 倍),这会在 Kafka 中造成数据积压。

我想增加每个消费者接收的 Dstream 的分区数。

我希望解决方案能够增加消费者的分区,而不是增加 Kafka 中的分区。

假设你有足够的硬件资源分配给消费者,你可以检查下面的参数

spark.streaming.kafka.maxRatePerPartition

您可以设置每秒从单个 kafka 分区消费的记录数。

在直接流方法中,最多可以有#consumers = #partitions。 Kafka 不允许每个分区超过一个消费者 group.id。顺便说一句,你要求每个消费者有更多的分区?这无济于事,因为您的消费者已经 运行 满负荷,但仍然不足。

您可以尝试进行一些技术更改来减少 kafka 上的数据积压:

  1. 增加分区数量 - 尽管您不想这样做,但这仍然是最简单的方法。有时平台只需要更多的硬件。

  2. 优化消费者端的处理 - 在处理前检查记录重复数据删除的可能性,减少磁盘I/O,循环展开技术等以减少消费者花费的时间。

  3. (更高难度) 受控数据分布 - 通常会发现某些分区能够比其他分区处理得更好。如果您的平台属于这种情况,可能值得一看。 Kafka的数据分布策略有一些preferences(以及message-key)经常会造成集群内部负载不均:https://www.cloudera.com/documentation/kafka/latest/topics/kafka_performance.html