【问题标题】:How can I read faster from Kafka我怎样才能更快地阅读 Kafka
【发布时间】:2019-12-16 06:25:06
【问题描述】:

我创建了一个新的 Kafka 服务器(我创建了 1 个具有 1 个分区的代理),并且我成功地使用 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 生成了 100,000 条消息。 每条消息大小为 2 KB,读取所有批次的 100000 条记录需要 20669 毫秒或 20 秒(总时间),这意味着每秒 5000 条记录。

我希望它更高,我可以设置的最理想的值是多少,或者我可能需要使用其他设置,或者我需要设置我的 Kafka 服务器(多个代理或分区)?

【问题讨论】:

  • 添加更多主题。添加更多分区。确保您运行多个并发使用者,并且与分区数量的比例相当(不一定是 1:1,但同样没有 100 个分区和一个读取器)。检查瓶颈,例如网络、磁盘等。也许您需要将分区分布在多个磁盘和/或集群 kafka 设置。编辑:如果这个帖子被删除,我不会感到惊讶,因为它只是“让它更快”,这并不是一个真正的问题
  • 感谢您的回答:) 所以实际上您是说消费者设置与性能问题无关。根据您的回答,我认为可能会激活多个使用者实例(在 java 中使用多线程),并且每个线程将从不同的分区读取,这意味着不同的组 ID。这是你认为应该工作的东西吗?为什么你认为它会被删除?你可以说这是一个性能问题
  • 对于最后一部分 - 它有点通用,有点 RTFM。无论如何 - 是的,您的消费者应该自动从不同的分区读取(取决于它的访问方式)。它进入了更棘手的领域,但是当您谈论“例如性能”时,您的分区可能是头重脚轻的(例如,不均匀分布)。您的瓶颈可能有多种原因(同样,它可能很慢,因为写入正在锤击它)。它不一定是万能的,可能需要几个月的时间才能找到满足您要求的解决方案。
  • AUTO_OFFSET_RESET_CONFIG 将从消息 0 中读取(前提是它没有被删除),因此可能不是您想要的行为 - 也许 LATEST 是最好的(尽管再次根据您的要求)。看看你是如何访问 kafka 实例的(通过连接器?)是否有任何争用。如果您的文章跟上,我会说问题仅出在您的消费者身上(目前)。
  • 好的,至少我现在有了方向,谢谢!

标签: java apache-kafka kafka-consumer-api producer-consumer consumer


【解决方案1】:

除了您提到的设置并忽略水平缩放/分区:

如果你不使用压缩,那就去做吧!

来自维基:

如果启用,数据将由生产者压缩,写入 服务器上的压缩格式,由消费者解压。

lz4 压缩类型在我的经验中被证明是一个不错的类型,生产者的示例设置:

compression.type = lz4
batch.size = 131072
linger.ms = 10

这意味着需要在网络中传输更少的数据,而另一方面则需要更多的 CPU 用于压缩/解压缩。

您可以在this 中找到与批处理和逗留时间相关的更多信息,我给出的其他答案与超时有关,但它侧重于生产者部分。

【讨论】:

  • 好建议!谢谢!
【解决方案2】:

从基本的角度来看 - kafka 客户端为每个“感兴趣的代理”(==领导他们关心的主题分区的任何代理)维护一个套接字。 在这个套接字上,kafka 一次只会做一个请求/响应(max.in.flight.requests.per.connection 有一个生产者设置,但代理一次只服务一个)。 这意味着,总的来说,如果你想要更多的带宽,你需要更多的套接字和更大的请求。这意味着多个代理和/或多个客户端,并且绝对不止一个分区。 至于你可以为你的情况调整的东西(单客户端、单分区、单套接字):

FETCH_MAX_BYTES_CONFIG = 52428800
MAX_PARTITION_FETCH_BYTES_CONFIG = 1048576

您将总体响应的最大大小设置为 50MB,但将同一响应中任何特定分区的数据大小限制为 1MB。在您的情况下(1 个分区),这意味着您的最大响应大小实际上是 1MB。顶一下。

如其他答案所述,您可以为您的主题启用压缩(理想情况下在生产者方面,尽管代理可以配置为“转码”),您还可以使用其他影响较小的参数,例如 check. crcs和receive.buffer.bytes

有关消费者配置的完整列表 - 请参阅 https://kafka.apache.org/documentation/#consumerconfigs

【讨论】:

  • 所以如果我目前理解的话,我应该将 MAX_PARTITION_FETCH_BYTES_CONFIG 至少设置为 FETCH_MAX_BYTES_CONFIG,如果不多的话。我说的对吗?
  • 我认为MAX_PARTITION_FETCH_BYTES_CONFIG > FETCH_MAX_BYTES_CONFIG 不会为您带来任何额外的好处,但我通常建议人们将两者设置为相同的值。
  • 好的,太好了!感谢您的帮助!
猜你喜欢
  • 2023-03-14
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多