我创建了一个新的kafka服务器(我创建了一个带有一个分区的代理),并且我成功地使用java代码从这个服务器生成和消费,但是作为一个消费者,我每秒读取的事件数量让我不满意。
我已经使用了以下消费者设置:
AUTO_OFFSET_RESET_CONFIG = "earliest"
FETCH_MAX_BYTES_CONFIG = 52428800
MAX_PARTITION_FETCH_BYTES_CONFIG = 1048576
MAX_POLL_RECORDS_CONFIG = 10000
pollDuration = 3000
但不管我输入什么作为每个设置的值,结果都是一样的
目前,我给Kafka发了10万条短信。每个消息大小为2kobytes,读取100000条记录的所有批处理需要20669毫秒或20秒(总时间),这意味着每秒读取5000条记录。
我希望它会更高,什么是最理想的值我可以设置,或者我需要使用其他设置,或者我需要设置kafka服务器(多个代理或分区)?
2条答案
按热度按时间ocebsuys1#
从基本的Angular 来看,kafka客户机为每个“感兴趣的代理”维护一个套接字(==引导他们关心的主题分区的任何代理)。在这个套接字上,kafka一次只执行一个请求/响应(max.in.flight.requests.per.connection有一个producer设置,但代理一次只服务一个)。这意味着,总的来说,如果你想要更多的带宽,你需要更多的套接字和更大的请求。这意味着多个代理和/或多个客户机,而且肯定不止一个分区。至于您可以针对您的情况进行调整的内容(单客户端、单分区、单套接字):
您将整个响应的最大大小设置为50mb,但将同一响应中任何特定分区的数据大小限制为1mb。在您的情况下(1个分区),这意味着您的最大响应大小实际上是1mb。把它撞上去。
如其他答案中所述,您可以为主题启用压缩(理想情况下,在生产者端,虽然代理可以配置为“转码”),还可以使用其他影响较小的参数,如check.crcs和receive.buffer.bytes
有关使用者配置的完整列表,请参阅https://kafka.apache.org/documentation/#consumerconfigs
0ve6wy6x2#
除了您提到的设置和忽略水平缩放/分区之外:
如果你不使用压缩,那就做吧!
从wiki:
如果启用,数据将由生产者压缩,以压缩格式写入服务器并由使用者解压缩。
lz4
根据我的经验,压缩类型被证明是一种很好的类型,制作人的示例设置:这意味着更少的数据必须在网络中传输,另一方面,更多的cpu用于压缩/解压缩。
你可以在我给出的另一个关于超时的答案中找到更多关于批处理和延迟时间的信息,但是它集中在生产者部分。