我用java构建了一个kafka应用程序,它具有:
为Kafka制作唱片的制作人
使用这些记录的Kafka流,对其值应用一些(时间窗口和状态存储)操作并将它们发送回Kafka
消费这些转换后的值并将其写入数据库的消费者
我正在测量生产者记录(被kafka流消费)和消费者记录(被消费者消费)的kafka时间戳之间的时间差。所以基本上当生产者记录被创建,当这个记录被流转换并发送回Kafka。最后,我取数据库中每个时差的平均值。
无论出于什么原因,当我向主题添加更多流节点和更多分区时,时间差都会增加。我真的以为时差会减小。现在我想知道是我做错了什么,还是会发生这样的情况:通过增加节点的数量,数据处理需要更长的时间。
最后,我的问题是:有没有可能在kafka中添加更多的节点,从而使数据处理花费更长的时间?如果是,原因是什么?
1条答案
按热度按时间2ul0zpep1#
“有没有可能在Kafka上增加更多的节点,数据处理会花费更长的时间?如果是,原因是什么?”
是的,这可能发生,并且高度依赖于实际生成的数据量。需要通过使用更多的分区/流节点来平衡数据量和并行性,以避免不必要的开销。
在您的特定案例中,我能想到的主要原因是kafkaproducer端的批处理更高效,分区数量更少。
假设您有10条消息和一个分区。kafkaproducer可能会将这10条消息合并到一个批处理中,并对其应用一个似乎相当有效的压缩。
现在,如果您有10条消息和10个分区,使得每条消息都进入自己的分区,那么kafkaproducer必须向代理发送10个单独的send请求(每个分区一个),而且您的压缩率也较低,因为您总是只压缩一条消息。
此外,如果您的kafkaproducer在同步模式下工作,那么它必须更频繁地等待代理的回复(这可能会根据生产者配置而有所不同)
acks
以及max.request.in.flight
).