Apache kafka 获取重试回退错误并在marathon上不重新启动kafka流

Apache kafka 获取重试回退错误并在marathon上不重新启动kafka流,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我们有高可用性的卡夫卡。我们在多个主题上运行多个卡夫卡流和spark作业 但是,我们发现了一个发送记录的奇怪问题。我们收到的错误是这样的 由于{},任务[0_4]将记录(键27314 value example.jar.class时间戳1535741326818)发送到主题名时出错;不会发送更多记录,也不会为此任务记录更多偏移量。 您可以增加生产者参数retries和retry.backoff.ms以避免此错误。 org.apache.kafka.streams.errors.StreamsEx

我们有高可用性的卡夫卡。我们在多个主题上运行多个卡夫卡流和spark作业

但是,我们发现了一个发送记录的奇怪问题。我们收到的错误是这样的

由于{},任务[0_4]将记录(键27314 value example.jar.class时间戳1535741326818)发送到主题名时出错;不会发送更多记录,也不会为此任务记录更多偏移量。 您可以增加生产者参数
retries
retry.backoff.ms
以避免此错误。 org.apache.kafka.streams.errors.StreamsException:任务[0_4]中止发送,因为以前的记录(键27314 value example.jar)捕获到错误。class@6f7cb16c由于topic_NAME-4的1条记录过期,topic_NAME的时间戳为1535741326818):自批创建加上延迟时间后已过42708毫秒 您可以增加生产者参数
retries
retry.backoff.ms
以避免此错误

我们还尝试将“逗留时间”保持为0,以便它在收到时立即处理。但是没有运气

我们的配置如下

retries: 3
retry-backoff-ms: 20000
replication-factor: 1
reconnect-backoff-ms: 60000
max-poll-records: 1000
session-timeout-ms: 300000
此外,我们有马拉松来管理卡夫卡流,但它没有检测到失败,也没有自动重新启动


因此,我想正确运行kafka流,或者在出现此类错误时自动重新启动marathon(最后一个选项)。

如果kafka流中发生错误,则只有内部
StreamThread
死亡,但在“主”线程中不会引发异常。我想,这就是为什么没有检测到错误。建议在
KafkaStreams
客户机上注册一个未捕获的异常句柄,以获得关于即将死亡的线程的通知并做出相应的反应


关于错误本身。这可能是一个已知的问题(请比较详细信息)。您可以尝试增加参数
request.timeout.ms
作为解决方法。

如果Kafka流中发生错误,则只有内部
StreamThread
死亡,但“主”线程中没有引发异常。我想,这就是为什么没有检测到错误。建议在
KafkaStreams
客户机上注册一个未捕获的异常句柄,以获得关于即将死亡的线程的通知并做出相应的反应


关于错误本身。这可能是一个已知的问题(请比较详细信息)。您可以尝试增加参数request.timeout.ms作为解决方法。

我也遇到了同样的问题。集群中有5个代理,主题的32个分区的复制因子为2


我忘了卡夫卡流创建内部主题。默认情况下,它们的复制因子为1。原因是,当我们试图杀死一个代理时,内部主题无法访问,因为它没有副本。因此,请尝试将内部主题的复制因子设置为与源主题的复制因子相同。我希望这会有帮助

我也面临同样的问题。集群中有5个代理,主题的32个分区的复制因子为2


我忘了卡夫卡流创建内部主题。默认情况下,它们的复制因子为1。原因是,当我们试图杀死一个代理时,内部主题无法访问,因为它没有副本。因此,请尝试将内部主题的复制因子设置为与源主题的复制因子相同。我希望这会有帮助

关于“相应地作出反应”。我已经注册了一个
uncaughtExceptionHandler
,它轻轻地关闭Streams应用程序资源并结束任务。有没有一种方法可以在不破坏整个应用程序的情况下从线程死亡中恢复?安全吗?另一个
StreamThread
spawn是否能够跟上预期的线程数?要恢复线程,您需要
KafkaStreams#close()
现有客户端,创建一个新客户端,然后重新启动它。@MatthiasJ.Sax现在是这种情况吗?使用2.3.0版?我们将Kafka与Kerberos一起使用。生产者和消费者总是在集群反弹后恢复,但streams应用程序没有。流线程死亡后,我们必须手动重新启动应用程序。希望有一种简单的方法来恢复。行为仍然是一样的,没有其他方法可以自动恢复线程。我们实际上希望在Kafka 2.7中解决这个问题——请继续关注。@MatthiasJ.Sax我们在日志中有相同的错误,并且我们将uncaughtExceptionHandler附加到KafkaStreams对象。处理程序应该打印有关异常的一些详细信息,但是在出现上述错误的情况下,永远不会调用此处理程序。这个错误是否应该触发对处理程序的调用?关于“相应地作出反应”。我已经注册了一个
uncaughtExceptionHandler
,它轻轻地关闭Streams应用程序资源并结束任务。有没有一种方法可以在不破坏整个应用程序的情况下从线程死亡中恢复?安全吗?另一个
StreamThread
spawn是否能够跟上预期的线程数?要恢复线程,您需要
KafkaStreams#close()
现有客户端,创建一个新客户端,然后重新启动它。@MatthiasJ.Sax现在是这种情况吗?使用2.3.0版?我们将Kafka与Kerberos一起使用。生产者和消费者总是在集群反弹后恢复,但streams应用程序没有。流线程死亡后,我们必须手动重新启动应用程序。希望有一种简单的方法来恢复。行为仍然是一样的,没有其他方法可以自动恢复线程。我们实际上希望在Kafka 2.7中解决这个问题——请继续关注。@MatthiasJ.Sax我们在日志中有相同的错误,并且我们将uncaughtExceptionHandler附加到KafkaStreams对象。处理程序应该打印有关异常的一些详细信息,但是在出现上述错误的情况下,永远不会调用此处理程序。此错误是否应触发对处理程序的调用?