kafka connector commit 失败

本文探讨了Kafka中CommitFailedException的问题及其解决方法,分析了与heartbeat.interval.ms及offset.flush.interval.ms配置相关的因素,并提供了调整建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 上栈
[2016-07-01 15:58:55,889] ERROR Commit of Thread[WorkerSinkTask-beaver_http_response-connector-0,5,main] offsets threw an unexpected exception:  (org.apache.kafka.connect.runtime.WorkerSinkTask:101)
org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed due to group rebalance
    at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:552)
    at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:493)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:665)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator$CoordinatorResponseHandler.onSuccess(AbstractCoordinator.java:644)
    at org.apache.kafka.clients.consumer.internals.RequestFuture$1.onSuccess(RequestFuture.java:167)
    at org.apache.kafka.clients.consumer.internals.RequestFuture.fireSuccess(RequestFuture.java:133)
    at org.apache.kafka.clients.consumer.internals.RequestFuture.complete(RequestFuture.java:107)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient$RequestFutureCompletionHandler.onComplete(ConsumerNetworkClient.java:380)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:288)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.clientPoll(ConsumerNetworkClient.java:320)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:213)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:193)
    at org.apache.kafka.clients.consumer.internals.ConsumerNetworkClient.poll(ConsumerNetworkClient.java:163)
    at org.apache.kafka.clients.consumer.internals.AbstractCoordinator.ensureCoordinatorKnown(AbstractCoordinator.java:180)
    at org.apache.kafka.clients.consumer.KafkaConsumer.pollOnce(KafkaConsumer.java:861)
    at org.apache.kafka.clients.consumer.KafkaConsumer.poll(KafkaConsumer.java:828)
    at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:171)
    at org.apache.kafka.connect.runtime.WorkerSinkTaskThread.iteration(WorkerSinkTaskThread.java:90)
    at org.apache.kafka.connect.runtime.WorkerSinkTaskThread.execute(WorkerSinkTaskThread.java:58)
    at org.apache.kafka.connect.util.ShutdownableThread.run(ShutdownableThread.java:82)
[2016-07-01 15:58:55,889] ERROR Commit of Thread[WorkerSinkTask-beaver_http_response-connector-8,5,main] offsets threw an unexpected exception:  (org.apache.kafka.connect.runtime.WorkerSinkTask:101)
      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
2. 原因

有个很重要的概念,kafka会管理如何分配分区的消费。 
(1)当某个consumer消费了数据,但是在特定的时间内没有commit,它就认为consumer挂了。这个时候就要reblance了。这个时间和“heartbeat.interval.ms”配置相关。 
(2)每次consumer从kafka poll数据时,每次poll会有一个量的控制,“max.partition.fetch.bytes”配置决定。

抛开kafka connect而言,上面这个两个配置要协调好,如果max.partition.fetch.bytes过大,heartbeat.interval.ms时间过短。恭喜你,肯定就开始上面的栈了。

好,把kafka connect拉过来piu piu吧。它有个很低调的配置:“offset.flush.interval.ms”。这个配置意义很重大,它是commit offset的时间间隔,默认是60秒。我检查了下我的配置:

"heartbeat.interval.ms":"30000"
      
  • 1

也就是说30秒如果kafka connector不给kafka commit offset,就要reblance了。改了配置后,整个世界清静了。

3. 遗留问题

这个栈只有数据量灰常大的时候才会出现,为什么数据量小的时候不出现?

\kafka-2.0.0\clients\src\main\java\org\apache\kafka\clients\consumer\KafkaConsumer.java
      
  • 1

上面的类的pollOnce方法中也许有答案。

喜欢看洋文的骚年,这里有相关文章: 
http://stackoverflow.com/questions/35658171/kafka-commitfailedexception-consumer-exception 
配置说明,这里找: 

https://kafka.apache.org/090/configuration.html

原文地址:http://blog.youkuaiyun.com/xianzhen376/article/details/51802736

### 架构设计概述 使用 Kafka 实现多服务器日志汇总到一台服务器的核心思想是通过 Kafka 的分布式消息队列机制,将各个服务器上的日志数据统一发送到 Kafka 集群中,再由中央服务器消费这些日志数据并进行集中处理或存储。 Kafka 提供了高吞吐、可扩展、持久化的消息传递能力,非常适合用于日志收集场景。在实际部署中,每台服务器上运行一个日志采集客户端(如 Flume 或 Filebeat),负责将本地日志文件内容发送到 Kafka 的特定主题(Topic)中。中央服务器作为 Kafka 消费者订阅该主题,并从 Kafka 中拉取日志数据进行处理和归档[^1]。 ### 日志采集端配置 在每台应用服务器上部署日志采集组件,例如 Flume Agent。Flume 可以通过 Syslog Source 监听本地日志输出,然后将日志写入 Kafka Channel,最终由 Kafka Sink 发送到 Kafka 集群中的指定 Topic。 ```properties agent.sources = syslog-source agent.channels = kafka-channel agent.sinks = kafka-sink # 配置 Syslog Source agent.sources.syslog-source.type = syslogtcp agent.sources.syslog-source.port = 5140 agent.sources.syslog-source.host = localhost # 配置 Kafka Channel agent.channels.kafka-channel.type = org.apache.flume.channel.kafka.KafkaChannel agent.channels.kafka-channel.kafka.bootstrap.servers = kafka-broker1:9092,kafka-broker2:9092 agent.channels.kafka-channel.topic = logs agent.channels.kafka-channel.group.id = flume-consumer-group # 配置 Kafka Sink agent.sinks.kafka-sink.type = logger ``` ### Kafka 集群部署与配置 在 Kafka 集群部署过程中,需要确保每个 Broker 的 `broker.id` 参数唯一,并且正确配置 `zookeeper.connect` 指向 Zookeeper 集群地址。启动 Kafka Broker 的命令如下: ```bash cd /opt/module/kafka nohup ./bin/kafka-server-start.sh ./config/server.properties > kafka.log 2>&1 & ``` 创建用于日志传输的 Topic: ```bash ./bin/kafka-topics.sh --create --topic logs --partitions 3 --replication-factor 2 --bootstrap-server kafka-broker1:9092 ``` ### 中央日志处理服务实现 中央服务器通过 Kafka Consumer API 订阅日志 Topic,并持续消费日志数据。以下是一个基于 Java 的简单消费者示例,它连接 Kafka 并将日志写入本地文件系统: ```java Properties props = new Properties(); props.put("bootstrap.servers", "kafka-broker1:9092"); props.put("group.id", "central-log-consumer"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("logs")); while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value()); } ``` 若需进一步处理日志数据,可以将 Kafka Consumer 与 Solr、Elasticsearch 等搜索引擎集成,实现日志的实时索引与查询功能。MorphlineSolrSink 即可用于解析 Kafka 消息并将结构化文档提交至 Solr Server 进行索引[^1]。 ### 数据持久化与分区策略 Kafka 支持多种分区策略,包括按时间、记录数或自定义逻辑进行分区。HDFS Connector 可以将 Kafka 中的数据持续写入 HDFS,每个 Kafka Topic 的数据可以根据 Partition 和 Offset 分块存储为独立文件,便于后续批量处理与分析[^3]。 默认情况下,数据按照 Kafka Topic 和 Partition 进行组织,也可以根据业务需求自定义分区函数,实现更细粒度的数据分布控制。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值