<>Kafka常见问题

<>摘要

本文记录了kafka-0.8.2.1、Kafka-1.1.1、Kafka-2.x 版本的常见问题及解决方法。

<>1 Kafka-0.8.2.1

<>1.1 Consumer报错

* 问题描述: WARN [
console-consumer-23149_hadoop2-1476872289945-6edaec5e-leader-finder-thread],
Failed to add leaderfor partitions [filelog_v3_json_test_1019,13],....; will
retry(kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)WARN [
console-consumer-23149_hadoop2-1476872289945-6edaec5e-leader-finder-thread],
Failed to add leaderfor partitions [filelog_v3_json_test_1019,13],....; will
retry(kafka.consumer.ConsumerFetcherManager$LeaderFinderThread)
java.nio.channels.ClosedChannelException[2016-10-19 18:18:11,801] WARN Fetching
topic metadata with correlationid 4 for topics [Set(filelog_v3_json_test_1019)]
from broker[id:0,host:es-gangw,port:9092] failed (kafka.client.ClientUtils$)
* 解决方案:
检查server.properties文件 的host.name字段,是否配置生效?(注意前面是否有#号,有就去掉才生效)
<>1.2 第一次推topic数据的时候报错,重新推就正常了

* 问题描述: bin/kafka-console-producer.sh --broker-list
10.1.17.51:9092,10.1.17.52:9092,10.1.17.53:9092 --topic chengc_1104 222[
2016-11-04 10:45:43,274] WARN Error while fetching metadata [{TopicMetadata for
topic chengc_1104 -> No partition metadata for topic chengc_1104 due to
kafka.common.LeaderNotAvailableException}] for topic [chengc_1104]: class
kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo) [
2016-11-04 10:45:43,291] WARN Error while fetching metadata [{TopicMetadata for
topic chengc_1104 -> No partition metadata for topic chengc_1104 due to
kafka.common.LeaderNotAvailableException}] for topic [chengc_1104]: class
kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo) [
2016-11-04 10:45:43,293] ERROR Failed to collate messages by topic, partition
due to: Failed to fetch topic metadatafor topic: chengc_1104 (
kafka.producer.async.DefaultEventHandler) [2016-11-04 10:45:43,402] WARN Error
while fetching metadata [{TopicMetadata for topic chengc_1104 -> No partition
metadatafor topic chengc_1104 due to kafka.common.LeaderNotAvailableException}]
for topic [chengc_1104]: class kafka.common.LeaderNotAvailableException (
kafka.producer.BrokerPartitionInfo) [2016-11-04 10:45:43,407] WARN Error while
fetching metadata[{TopicMetadata for topic chengc_1104 -> No partition metadata
for topic chengc_1104 due to kafka.common.LeaderNotAvailableException}] for
topic[chengc_1104]: class kafka.common.LeaderNotAvailableException (
kafka.producer.BrokerPartitionInfo) [2016-11-04 10:45:43,407] ERROR Failed to
collate messages by topic, partition due to: Failed to fetch topic metadatafor
topic: chengc_1104(kafka.producer.async.DefaultEventHandler) [2016-11-04
10:45:43,521] WARN Error while fetching metadata [{TopicMetadata for topic
chengc_1104 -> No partition metadata for topic chengc_1104 due to
kafka.common.LeaderNotAvailableException}] for topic [chengc_1104]: class
kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo) [
2016-11-04 10:45:43,527] WARN Error while fetching metadata [{TopicMetadata for
topic chengc_1104 -> No partition metadata for topic chengc_1104 due to
kafka.common.LeaderNotAvailableException}] for topic [chengc_1104]: class
kafka.common.LeaderNotAvailableException(kafka.producer.BrokerPartitionInfo) [
2016-11-04 10:45:43,527] ERROR Failed to collate messages by topic, partition
due to: Failed to fetch topic metadatafor topic: chengc_1104 (
kafka.producer.async.DefaultEventHandler)
* 解决方案:
需要先手动创建topic再推数据,0.8.2.1遇到这个问题
<>1.3 由于Kafka auto rebalance ,导致将磁盘IO打满,网络流量速度上限超过磁盘IO

*
问题描述
Kafka在两种情况会造成副本数确实或partition不均衡,从而导致auto rebalance:
1.Kafka副本同步超时
2.有节点挂点或重启

*
解决方案
这种情况可以考虑关闭rebalance : auto.leader.rebalance.enable
,然后进行命令行手动balance,可以自己选时间,否则有可能导致在十分繁忙的时候进行rebalance造成负载过高.

*
关于手动自行rebalance说明:

每当一个broker关闭或leader机制挂掉的时候,其上的topic的partition副本会转移到其他节点。这意味着,默认情况下当broker重启时仅会作为各partition副本的follower存在,也就是说不会处理客户端读写请求。

为了避免这种情况,Kafka有一个优先副本(preferred replicas
)的概念。比如说,某个partition的副本存在于1,5,9节点,此时1号节点就是可作为leader的优先副本,因为他更早加入了副本列表。

你可以让Kafka群集通过运行以下命令来尝试恢复已恢复副本的领导:
bin/kafka-preferred-replica-election.sh --zookeeper zk_host:port/chroot
<>1.4 topic的leader全部为none

* 解决方案
检查副本数factor是否大于节点数,比如只有单节点却设factor为2。这个时候改为1就好了
<>2 Kafka-1.1.1

<>2.1 kafka-connect

启动官方示例:
./bin/connect-standalone.sh config/connect-standalone.properties
config/connect-file-source.properties config/connect-file-sink.properties&
报错如下:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.
collect.Sets$SetView.iterator()Lcom/google/common/collect/UnmodifiableIterator;
这个问题查了很久,说了半天都没有一个明确的解决方法,现在我说下我的解决方案。

首先这个问题的原因是因为OS里面已经配置的classpath包含了较低版本(18.0)的guava包,里面没有我们期望的$KAFKA_HOME/libs/guava-20.0.jar,所以导致报错。

查看connect-standalone.sh发现他调用的是kafka-run-class.sh,而这里面使用了CLASSPATH
,所以我们直接在最前面添加一行:CLASSPATH="/home/kafka/kafka_2.11-1.1.1/libs/*"。

重新启动connect-standalone.sh,已经没问题了。

还有个思路就是将我们要用的Kafka的lib路径添加到OS的classpath中,注意要放在前面,优先加载。

<>2.2 Timeout of 60000ms expired before the position for partition xxx_topic
could be determined

这个问题一般是由于Kafka集群的某个Broker节点负载过高,无法及时响应producer发送数据的请求导致。

<>3 Kafka-2.x

<>2.1 源码gradle初始化Could not find method scala

我一开始是从github
clone的是最新的代码,版本为2.7,然后gradle(版本为最新的6.5)一直报错,说有一个什么Configuration类找不到。

然后将gradle降级为5.6.4,解决了该报错。

但是又有新的报错:

Could not find method scala() for arguments [
build_2ofsm9wzcvhxxkvqblsz8ogy5$_run_closure5$_closure73$_closure105@729633ff]
on object of type org.gradle.api.plugins.scala.ScalaPlugin.
网上也没找到答案,最后我尝试降级kafka版本,具体来说是将分支从2.7且为了2.3,就没有报错了。。。

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信