《Kafka系列》Kafka常见问题处理记录

Kafka常见问题处理记录

一、kafka创建topic失败, Replication factor: 1 larger than available brokers: 0

1.创建语句如下所示,按照习惯在添加zookeeper参数的时候,指定了zxy:2181/kafka,但是却创建失败,Error while executing topic command : Replication factor: 1 larger than available brokers: 0.

[root@zxy bin]# kafka-topics.sh --create --topic tp1 --zookeeper zxy:2181/kafka --partitions 3 --replication-factor 1
Error while executing topic command : Replication factor: 1 larger than available brokers: 0.
[2023-03-27 17:15:46,605] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 1 larger than available brokers: 0.
 (kafka.admin.TopicCommand$)

2.检查各个broker的server.properties文件

发现在配置参数的时候,zookeeper.connect指定的是zxy:2181,zxy:2182,zxy:2183

[root@zxy config]# cat server01.properties
broker.id=1
port=9091
listeners=PLAINTEXT://localhost:9091
log.dirs=/zxy/apps/kafkaCluster/kafkaLog01
zookeeper.connect=zxy:2181,zxy:2182,zxy:2183

3.指定zookeeper参数为zxy:2181,创建成功

[root@zxy bin]# kafka-topics.sh --create --topic tp1 --zookeeper zxy:2181 --partitions 3 --replication-factor 1
Created topic "tp1".

二、服务器Cannot allocate memory

问题:在使用服务器中遇到内存无法分配到问题导致启动不了Kafka
思路一:根据查找方法,最后将vm.overcommit_memory设为1,但是对我这个问题没有太大帮助

管理员下三种方案
1.编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
2.sysctl vm.overcommit_memory=1
3.echo 1 > /proc/sys/vm/overcommit_memory,然后sysctl –p永久生效

思路二:然后通过修改为kafka分配的内存,还是没有解决问题

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
fi

修改为

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"
fi

思路三:最后想到zookeeper已经启动了,是不是因为它分配的内存太多了,减少为zookeeper分配的内存

if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"
fi

三、Offset Explorer连接Kafka问题集合,(Timeout expired while fetching topic metadata),(Uable to find any brokers)

1. Timeout expired while fetching topic metadata

1.Offset Explorer配置好zookeeper的连接地址后

在这里插入图片描述

2.在查看Topics的时候,报错Timeout expired while fetching topic metadata

在这里插入图片描述

3.排查发现应该是kafka的server.properties文件中的advertised.listeners问题

  • 修改前是

    advertised.listeners=PLAINTEXT://localhost:9091
    
  • 修改后

    advertised.listeners=PLAINTEXT://:9091
    

4.修改好配置文件后,重启Kafka即可

2.Uable to find any brokers

1.重新连接后,又遇到Uable to find any brokers问题,访问不到的原因是,Offset Explorer访问Kafka的时候,是因为Kafka tool是通过主机名访问的,所以要在windows的hosts文件中配置上Kafka服务器的IP映射,配置目录在C:\Windows\System32\drivers\etc

在这里插入图片描述

2.打开C:\Windows\System32\drivers\etc,修改配置文件hosts,添加Kafka主机的映射关系

C:\Windows\System32\drivers\etc\hosts

125.262.96.387	zxy

3.断开连接后,在AdvancedBootstrap servers处配置好Kafka服务,重新连接即可

在这里插入图片描述

4.重新连接后,即可以看到已经可以正常看到Topics了

在这里插入图片描述

四、kafka数据到hudi丢失数据问题

1.报错问题


Caused by: java.lang.IllegalStateException: Cannot fetch offset 196 (GroupId: spark-kafka-source-6f1df211-fdcb-4bcc-813d-55c4f9661c9d-1732697149-executor, TopicPartition: news-0).
Some data may have been lost because they are not available in Kafka any more; either the
 data was aged out by Kafka or the topic may have been deleted before all the data in the
 topic was processed. If you don't want your streaming query to fail on such cases, set the
 source option "failOnDataLoss" to "false".

        at org.apache.spark.sql.kafka010.InternalKafkaConsumer$.org$apache$spark$sql$kafka010$InternalKafkaConsumer$$reportDataLoss0(KafkaDataConsumer.scala:642)
        at org.apache.spark.sql.kafka010.InternalKafkaConsumer.org$apache$spark$sql$kafka010$InternalKafkaConsumer$$reportDataLoss(KafkaDataConsumer.scala:448)
        at org.apache.spark.sql.kafka010.InternalKafkaConsumer$$anonfun$get$1.apply(KafkaDataConsumer.scala:269)
        at org.apache.spark.sql.kafka010.InternalKafkaConsumer$$anonfun$get$1.apply(KafkaDataConsumer.scala:234)
        at org.apache.spark.util.UninterruptibleThread.runUninterruptibly(UninterruptibleThread.scala:77)
        at org.apache.spark.sql.kafka010.InternalKafkaConsumer.runUninterruptiblyIfPossible(KafkaDataConsumer.scala:209)
        at org.apache.spark.sql.kafka010.InternalKafkaConsumer.get(KafkaDataConsumer.scala:234)
  • 翻译结果

    最终应用程序状态:失败,exitCode:15,(原因:用户类引发异常:org.apache.spark.sql.streaming.StreamingQueryException:由于阶段失败而中止作业:阶段2.0中的任务0失败4次,最近的失败:阶段2.0中的任务0.3丢失(TID 5,hadoop,executor 1):java.lang.IllegalStateException:无法获取偏移量196(GroupId:spark-kafka-source-e2868915-6d7a-4aef-99a8-3d1c5ef45147-1732697149-executor,主题分区:news-0)。
    一些数据可能已经丢失,因为它们在卡夫卡不再可用;要么是数据被卡夫卡过时了,要么是主题在处理完主题中的所有数据之前被删除了。如果您不希望流式查询在这种情况下失败,请将源选项“failOnDataLoss”设置为“false”。

2.根据提示添加配置文件 -> option(“failOnDataLoss”,“false”)

//5.读取Kafka源数据
        val df: DataFrame = spark.readStream.format("kafka")
            .option("kafka.bootstrap.servers", params.brokerList)
            .option("subscribe", params.topic)
            .option("startingOffsets", "latest")
            .option("kafka.consumer.commit.groupid", "action-log-group01")
            .option("failOnDataLoss","false")
            .load()

tips:认为添加这个配置不太妥当,但尚未找到适宜的方法
哪位博主知道的,希望可以指点指点

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: org.apache.kafka.common.errors.timeoutexception: 在获取主题元数据时超时已过期。 这个错误通常是由于Kafka客户端无法在规定的时间内获取到主题的元数据信息,导致超时。可能的原因包括网络延迟、Kafka服务器负载过高等。建议检查网络连接和Kafka服务器的负载情况,并尝试增加Kafka客户端的超时时间。 ### 回答2: 该错误码通常表示Kafka客户端在尝试获取Topci元数据时出现了超时。 Topic元数据是有关Kafka Topic及其分区的基本信息, 包括该Topic的存储位置、副本数等。 在Kafka中,每个Partition都有一个Broker在其中运行,客户端必须获取Broker的地址并向其发送数据和接收数据。 当Kafka客户端与Broker通信时, 发生网络问题可能导致请求超时, 经过一段时间后, Kafka客户端会超时并抛出 org.apache.kafka.common.errors.timeoutexception 错误代码。 这时客户端应该重试,或者检查网络和Kafka集群的状态。 此外,如果集群处于负载的状态, 即在高峰时间段,Broker处理请求的速度会变慢, 客户端请求的响应时间会相应变长, 可能也会导致超时异常被抛出。 如果只有某些应用出现此错误, 有可能是这些应用调用了字节码操作(Bytecode Operation),这种操作通常是在运行时对Class文件进行修改, 该操作可能导致一些Kafka配置文件加载错误,从而导致客户端无法获取Topic元数据。 总之, 对于该错误码的处理方式, 应该首先检查网络状况和Kafka集群的负载情况,如果这些条件确实正常, 则进一步检查应用程序中是否调用了字节码操作或其他可能导致常规Kafka操作失效的特殊程序。 一般地,此类错误可以通过增加超时时间以及增加Kafka客户端的重试次数来解决。 ### 回答3: 这个错误信息指的是 Kafka 在获取主题相关元数据时超时了。元数据是 Kafka 集群用来追踪主题和分区状态的信息,包括主题名称、分区副本数量、分区分配情况等。当 Kafka 客户端想要对一个特定的主题进行订阅或者发送消息时,它需要获取这些元数据,然后才能进行后续操作。 在获取元数据时,Kafka 客户端会向集群中的一个或多个 Broker 发送 Metadata Request 请求。这些请求会在 Broker 之间进行协作,以确定集群中的主题、分区和副本情况。如果在预定的时间内(默认值为 30 秒)无法得到响应,Kafka 就会抛出 TimeoutException 异常,此时可能会出现上述错误信息。 这种情况可能会发生在以下几种情况下: 1. Kafka 集群或 Broker 故障。如果集群或 Broker 处于不可用状态,那么客户端请求必然得不到响应。 2. 网络故障。如果客户端与集群之间的网络连接出现问题,比如网络延迟、丢包或者网络中断等,那么客户端请求也可能会超时。 3. 配置不合理。如果 Kafka 客户端的配置不合理,比如请求超时时间过短、同时发出的请求过多等,那么也可能会导致元数据获取失败。 为了解决这个问题,可以尝试以下几种方法: 1. 检查 Kafka 集群的状态,确保所有的 Broker 都处于正常状态。 2. 检查与集群通信的网络状态,确保网络连接正常。 3. 调整 Kafka 客户端的配置,尝试增加请求超时时间或者减少同时发出的请求数量等。 4. 如果以上方法都无效,可以尝试升级 Kafka 版本或者重启集群。 总之,如果遇到这个问题,需要进行仔细排查,从可能的原因中逐一排除,一步步缩小问题的范围,最终找到解决方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DATA数据猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值