Kafka-常见问题

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 leader for 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 leader for 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 correlation id 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 metadata for 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 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] 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 metadata for 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 metadata for 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,就没有报错了。。。

<think>嗯,用户遇到了Kafka启动时的ClassNotFoundException问题,具体是找不到kafka.Kafka类。这个问题通常发生在类路径配置错误或者Kafka的jar包缺失的情况下。我需要先理清楚可能的原因,然后逐步给出解决方案。首先,用户可能没有正确设置CLASSPATH环境变量,导致JVM找不到Kafka的主类。这时候需要检查启动脚本,比如kafka-server-start.sh,确认是否指定了正确的Kafka jars路径。另外,用户可能下载的Kafka版本不完整,或者在解压过程中文件损坏,导致必要的jar包缺失。这时候应该重新下载并验证文件的完整性。还有可能是用户使用了错误的启动命令,比如直接运行了某个jar而不是通过脚本启动。应该提醒用户使用官方提供的脚本,并确保脚本中的路径正确。此外,依赖冲突也是一个可能的原因,特别是当用户项目中存在旧版本的Kafka或其他库时,可能会覆盖正确的类。需要检查依赖树,排除冲突的库。 另外,环境变量如KAFKA_HEAP_OPTS如果设置不当,也可能干扰启动过程,建议用户暂时取消这些设置进行测试。最后,如果问题依旧存在,建议用户检查日志文件,查看更详细的错误信息,或者尝试在干净的测试环境中启动Kafka,以排除其他配置的影响。 在生成相关问题的时候,需要考虑用户可能进一步遇到的类路径问题、依赖冲突、环境变量配置,以及如何验证安装是否正确,这些都是常见的问题点。需要确保回答结构清晰,步骤明确,帮助用户逐步排查和解决问题。</think>### Kafka启动出现ClassNotFoundException的解决方案 出现`java.lang.ClassNotFoundException: kafka.Kafka`通常是因为Kafka核心类未正确加载,以下是逐步排查和解决方法: --- #### 1. **检查类路径配置** Kafka启动脚本(如`kafka-server-start.sh`)需要通过`CLASSPATH`加载Kafka的JAR包。 - **步骤**: - 打开`kafka-server-start.sh`,确认以下配置是否包含Kafka的JAR包路径: ```bash export CLASSPATH="$base_dir/libs/*" ``` - 若路径错误,手动修改为Kafka安装目录下的`libs`文件夹绝对路径。 --- #### 2. **验证Kafka安装完整性** 若Kafka的JAR包缺失(如`kafka_2.13-3.6.1.jar`),会导致主类无法加载。 - **步骤**: - 重新下载Kafka安装包([官网下载地址](https://kafka.apache.org/downloads))。 - 检查`libs`目录是否包含完整的JAR文件,尤其是`kafka-*`开头的核心包。 - 使用`shasum`或`md5sum`验证文件完整性(需对比官网提供的哈希值)。 --- #### 3. **使用正确的启动命令** 必须通过官方脚本启动Kafka服务,而非直接运行JAR。 - **正确命令示例**: ```bash bin/kafka-server-start.sh config/server.properties ``` - 若脚本权限不足,执行`chmod +x bin/*.sh`。 --- #### 4. **排查依赖冲突** 若项目中存在旧版Kafka依赖或冲突库(如Zookeeper),可能覆盖核心类。 - **步骤**: - 检查Maven/Gradle依赖树: ```bash mvn dependency:tree | grep kafka ``` - 排除冲突的依赖项(如`<exclusion>`标签)。 --- #### 5. **临时修复:手动指定类路径** 若脚本配置无法修改,可手动指定类路径启动: ```bash java -cp "libs/*" kafka.Kafka config/server.properties ``` --- #### 6. **检查环境变量干扰** 某些环境变量(如`KAFKA_HEAP_OPTS`)可能影响类加载。 - **临时测试**: ```bash unset KAFKA_HEAP_OPTS && bin/kafka-server-start.sh config/server.properties ``` --- ### 相关问题 1. **如何验证Kafka的CLASSPATH是否配置正确?** - 在启动脚本中添加`echo $CLASSPATH`输出调试信息[^1]。 2. **Kafka启动时出现NoClassDefFoundError如何解决?** - 可能是依赖的第三方库缺失,需检查`libs`目录或Maven配置[^2]。 3. **Kafka服务启动后自动退出,如何排查?** - 检查日志中的`OutOfMemoryError`或端口冲突问题[^3]。 4. **如何为Kafka分配自定义的JVM参数?** - 修改`kafka-server-start.sh`中的`export KAFKA_HEAP_OPTS="-Xmx2G -Xms2G"`[^4]。 [^1]: 类路径配置需指向包含所有Kafka核心JAR文件的目录。 [^2]: `NoClassDefFoundError`通常表示类初始化失败或间接依赖缺失。 [^3]: 端口冲突可通过`netstat -tuln | grep 9092`检测。 [^4]: JVM参数需根据服务器内存调整,避免内存不足或浪费。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值