当前位置: 首页 > 知识库问答 >
问题:

Kafka用户挂起的提取永远不会被删除,轮询保持返回0条记录

鲜于星波
2023-03-14

我们已经写了一个Kafka消费者投票的数据,基于配置…每个轮询返回大约400条我们缓冲的avro记录。在缓冲区之后,我们在端部偏移上进行查找。当缓冲区大小达到2000时,我们使用执行服务线程将它们写入HDFS,然后使用future.get等待全部完成。我们一直在HDFS(staging folder)中追加相同的文件,直到提交大小达到10K。在达到提交大小之后,我们将文件从staging目录移动到HDFS中的最终输出位置(这是为原子提交完成的)。下一次对缓冲数据的刷新将在staging目录中生成新文件。这样做是为了在HDFS中没有小文件,并限制打开的文件句柄。在将文件提交到输出位置后,我们执行偏移量的异步提交。

5分钟后,当完成4-5次成功的写入和偏移量提交时,我们开始获得以下日志:

我认为对该节点发出了某个提取请求,其回调从未将其从挂起的提取中移除。

这就是创建请求未来的地方:https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/consumer/internals/fetcher.java#l261

这是回调处理程序的一部分,我们将请求从挂起中移除:https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/consumer/internals/fetcher.java#l321

它阻碍了我对Kafka消费者的可用性测试,因为我们在5分钟内每次运行都会遇到这个障碍。记录消耗率开始于1000左右,当poll返回零记录时,它会下降到5rps。永远不会恢复。线程数和CPU使用率也下降了。

共有1个答案

罗允晨
2023-03-14

该问题是由于打开文件句柄造成的。这是因为Avro的dataFileWriter api处于追加模式。它采用可搜索的输入和输出流。当您关闭writer时,它将关闭输出流,而不是可搜索的输入。在所有数据节点上打开的文件句柄数超过44K,记录消耗率急剧下降。关闭可查询的输入显式地修复了该问题

 类似资料:
  • 我在Azure上创建了虚拟机,然后发现命名错误的存储。 VM:hanpohwan,存储:hanpohwa(截断名称,自动创建) 我删除了虚拟机,但存储不会永远删除。你现在怎么解决这个问题? hanpohwan-hanpohwan-os-1462083556580.vhd127.00 GB 2016-05-01 7:47:59应用程序/八位字节流https://hanpohwa.blob.core.

  • Python的新类型提示功能允许我们键入函数返回的提示… …或保留未指定的返回类型,PEP规定应导致静态分析器假设任何返回类型都是可能的: 任何没有注释的函数都应被视为具有最通用的类型 但是,我应该如何键入函数永远不会返回的提示?例如,键入 hint 这两个函数的返回值的正确方法是什么? 既没有指定

  • 我得到了一个具有多个EditText-字段的。当我尝试编辑其中一个-字段并单击虚拟键盘上的回车键时,焦点向下转移到下一个-字段,这是我不想发生的事情。我想提交我在第一个-字段中所做的更改,然后关闭键盘。我设法通过在我的. xml文件中添加以下内容来关闭这个焦点转移: 但问题仍然存在,现在更改从未提交,因为我的侦听器从未被调用。如果我在我的中删除除一个项目之外的所有项目,一切都会正常工作。我的中也有

  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 问题内容: 我试图比较两个相同类型的对象(在dosHave方法中),但是我从未返回过“ true”。这是我的代码: “ Osoba”类如下所示: 来自主代码: 无论我要使用什么输入,这部分都永远不会发生。“ kartoteka”是我当然进口的包裹。每个类都在单独的程序包中,但是使用它们没有问题。我已经尝试了一段时间,但没有任何帮助,似乎 从来都不是真的,但我不知道为什么。没有Boolean.TRU

  • 问题内容: 我正在使用Asp.net MVC3,并尝试在服务器上做一个简单的Ajax发布,它返回部分视图并在搜索过程中更新我的项目列表。 Ajax成功调用服务器,服务器通过发送部分视图进行响应。但是部分视图始终在新页面中呈现。我发现这是因为它不知道即将到来的ajax调用,因此它呈现了一个新页面。 我的控制器代码非常简单: 但是无论如何,Request.IsAjaxRequest()始终返回fals