kafka connect无法从``牧民工作线程中未捕获的异常开始....可以确定位置''

时间:2019-08-04 08:19:29

标签: apache-kafka apache-kafka-connect

我正在使用Kafka connect版本confluentinc/cp-kafka-connect:5.1.1-1。 卡夫卡集群kafka_2.11-0.11.0.3(3个经纪人)

这个kafka集群可以通过Spark Stream与旧的生产者/消费者一起正常工作。

现在我尝试添加kafka connect,但出现以下错误:

ERROR Uncaught exception in herder work thread, exiting:  

(org.apache.kafka.connect.runtime.distributed.DistributedHerder)
org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition kc-offsets-22 could be determined

我可以看到该主题存在。我什至可以使用以下命令来编写和阅读该主题:

./kafka-console-producer.sh \
    --broker-list `hostname`:9092 \
    --topic kc-offsets \
    --property "parse.key=true" \

./kafka-console-consumer.sh --zookeeper $KAFKA_ZOOKEEPER_CONNECT --topic kc-offsets --from-beginning --property print.key=true

kafka连接机器已连接到我所有的经纪人。

但是由于某种原因,kafka连接将无法启动。

我将非常感谢有关如何进行调查/解决的任何建议

更新: 我已尝试按照建议的here将副本更改为1,但没有帮助

2 个答案:

答案 0 :(得分:0)

该错误表明某些记录以比从客户端发送记录更快的速度放入队列。

当您的生产者(在这种情况下为Kafka Connect)发送消息时,它们会存储在缓冲区中(在将消息发送给目标代理之前),并且记录会被分组在一起以提高吞吐量。将新记录添加到批处理时,必须在request.timeout.ms控制的可配置时间窗口内发送记录(默认设置为30秒)。如果批处理在队列中放置的时间较长,则会抛出TimeoutException,然后将批处理记录从队列中删除,并且不会传递给代理。

增加request.timeout.ms的值应该可以解决这个问题。

如果此方法不起作用,您还可以尝试减少batch.size,以使批次发送的频率更高(但是这次将包含较少的消息),并确保linger.ms设置为0(这是默认值)。

如果仍然出现错误,我认为您的网络出现了问题。您启用了SSL吗?

答案 1 :(得分:0)

我找到了该问题的根本原因,我们的 __ consumer_offsets 主题已损坏。 在使用kafka-connect之前,我们使用的是老式消费者,所以我们没有看到这个问题。 对我们来说,解决方案是创建新的kafka集群,从而解决了该问题。

顺便说一句,要使该主题正常运行,只需阅读以下内容:

./kafka-console-consumer.sh --zookeeper $KAFKA_ZOOKEEPER_CONNECT --topic __consumer_offsetss --from-beginning --property print.key=true