根据 Direct 方法,它们是 32 个 Kafka 分区和 32 个消费者。但是 32 个消费者的数据处理速度比 Kafka 速率(1.5 倍)慢,这会导致 Kafka 中的数据积压。
我想增加每个消费者收到的 Dstream 的分区数。
我希望解决方案是增加消费者的分区,而不是增加 Kafka 的分区。
根据 Direct 方法,它们是 32 个 Kafka 分区和 32 个消费者。但是 32 个消费者的数据处理速度比 Kafka 速率(1.5 倍)慢,这会导致 Kafka 中的数据积压。
我想增加每个消费者收到的 Dstream 的分区数。
我希望解决方案是增加消费者的分区,而不是增加 Kafka 的分区。
假设您有足够的硬件资源分配给消费者,您可以检查以下参数
spark.streaming.kafka.maxRatePerPartition
您可以设置每秒从单个 kafka 分区消耗的记录数。
在直接流方法中,最多可以有#consumers = #partitions。Kafka 不允许每个 group.id 的每个分区有多个消费者。顺便说一句,您要求每个消费者更多的分区?这将无济于事,因为您的消费者已经满负荷运行并且仍然不足。
您可以尝试进行一些技术更改以减少 kafka 上的数据积压:
增加分区数 - 尽管您不想这样做,但这仍然是最简单的方法。有时平台只需要更多的硬件。
优化消费者端的处理——在处理之前检查重复记录的可能性,减少磁盘 I/O,循环展开技术等,以减少消费者花费的时间。
(更高难度) 受控数据分布 - 通常发现某些分区能够比其他分区处理得更好。如果您的平台是这种情况,可能值得一看。Kafka 的数据分发策略有一些偏好(以及消息密钥),这通常会导致集群内部负载不均匀:https ://www.cloudera.com/documentation/kafka/latest/topics/kafka_performance.html