成员流使用者无法将其从组中删除

时间:2018-07-09 06:10:48

标签: apache-kafka apache-kafka-streams

我有一个Streams应用程序,它引发以下异常:

Exception in thread "<StreamsApp>-StreamThread-1" org.apache.kafka.streams.errors.StreamsException: Exception caught in process. taskId=0_0, processor=KSTREAM-SOURCE-0000000000, topic=topic1, partition=0, offset=1
    at org.apache.kafka.streams.processor.internals.StreamTask.process(StreamTask.java:240)
    at org.apache.kafka.streams.processor.internals.AssignedStreamsTasks.process(AssignedStreamsTasks.java:94)
    at org.apache.kafka.streams.processor.internals.TaskManager.process(TaskManager.java:411)
    at org.apache.kafka.streams.processor.internals.StreamThread.processAndMaybeCommit(StreamThread.java:918)
    at org.apache.kafka.streams.processor.internals.StreamThread.runOnce(StreamThread.java:798)
    at org.apache.kafka.streams.processor.internals.StreamThread.runLoop(StreamThread.java:750)
    at org.apache.kafka.streams.processor.internals.StreamThread.run(StreamThread.java:720)
Caused by: org.apache.kafka.streams.errors.StreamsException: task [0_0] Abort sending since an error caught with a previous record (key null value {...} timestamp 1530812658459) to topic topic2 due to Failed to update metadata after 60000 ms.
You can increase producer parameter `retries` and `retry.backoff.ms` to avoid this error.

在Streams应用中,我具有以下配置

props.put(StreamsConfig.producerPrefix(ProducerConfig.RETRIES_CONFIG), 5);
props.put(StreamsConfig.producerPrefix(ProducerConfig.RETRY_BACKOFF_MS_CONFIG), 300000);
props.put(StreamsConfig.producerPrefix(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG), 300000);

我检查了 kafka经纪人日志(我有一个kafka经纪人),并查看了与此相关的以下日志:

INFO [GroupCoordinator 1001]: Member <StreamsApp>-StreamThread-1-consumer-49d0a5b3-be2a-4b5c-a4ab-ced7a2484a02 in group <StreamsApp> has failed, removing it from the group (kafka.coordinator.group.GroupCoordinator)
[2018-07-03 14:39:23,893] INFO [GroupCoordinator 1001]: Preparing to rebalance group <StreamsApp> with old generation 1 (__consumer_offsets-46) (kafka.coordinator.group.GroupCoordinator)
[2018-07-03 14:39:23,893] INFO [GroupCoordinator 1001]: Group <StreamsApp> with generation 2 is now empty (__consumer_offsets-46) (kafka.coordinator.group.GroupCoordinator)

我在某处读到它与消费者有关,在相当长的一段时间内没有调用poll(),因此它被消费者协调员赶走了,现在新消费者使用心跳作为故障检测协议。我不确定这是否是原因,因为我也在使用Kafka version 1.1.0streams version 1.1.0

如何避免这种故障情况?现在,每次发生这种情况时,我都必须重新启动流应用程序。

UPDATE-1:

我正在尝试通过将主体包含在StreamsException块中来处理try-catch,但是我无法捕获到异常。可能是什么原因造成的?如何捕获它并退出应用程序?目前,streams-app处于暂停状态,并且在发生此异常后没有采取任何措施。

UPDATE-2:

thisthis之后,我将代码更新为:

final KafkaStreams streams = new KafkaStreams(topology, props);
final CountDownLatch latch = new CountDownLatch(1);

streams.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
    log.error("EXITTING");
    log.error(throwable.getMessage());
    streams.close(5 ,TimeUnit.SECONDS);
    latch.countDown();
    System.exit(-1);            
});

现在处理并记录了异常。但是,Streams应用程序未退出(它仍在终端处于暂停状态下运行)。 Ctrl + C 不会杀死它。我必须通过获取pid的进程并对其调用kill来杀死它。

2 个答案:

答案 0 :(得分:0)

这是我停止流应用程序并退出它的方式。

final Topology topology = builder.build();
final KafkaStreams streams = new KafkaStreams(topology, props);
final CountDownLatch latch = new CountDownLatch(1);

streams.setUncaughtExceptionHandler((Thread thread, Throwable throwable) -> {
    log.error("EXITING");
    log.error(throwable.getMessage());
    latch.countDown();          
});

Runtime.getRuntime().addShutdownHook(new Thread(streams::close));

try {
    streams.start();
    latch.await();
} catch (Throwable e) {
    log.info("Exitting apllication with status code 1");
    System.exit(1);
}

log.info("Exitting apllication with status code 0");
streams.close(5 ,TimeUnit.SECONDS);
System.exit(0);

有关异常和相关代理日志:

减少max.poll.records,因此poll()的调用频率更高。 (融合的帮助论坛)。

我还没有尝试过。一旦我测试完成,就会更新。

答案 1 :(得分:-1)

我也遇到了同样的问题,即使重启进程也无法让消费者加入,每次都要为所有消费者重新启动这个Kafka。我调整了相关配置,但消费者继续出现问题写了大量的信息。 props.put("max.poll.interval.ms",30601000); props.put("session.timeout.ms",100000); props.put("max.poll.records",100); 我使用手动提交,当我消费完消息并处理它时,我提交偏移量。但是,我通常只使用几秒钟来完成整个交易,但我仍然将其设置为 30 分钟。期待有人告诉我这个问题。