Kafka踩坑 - Couldn't find leaders for Set
报错信息如下:
查看kafka相关的主题信息:
- [root@slave10 bin]# kafka-topics --describe --zookeeper 10.2.20.39:2181,10.2.20.40:2181,10.2.20.41:2181 --topic h5MarkData
- Topic:h5MarkData PartitionCount:3 ReplicationFactor:2 Configs:
- Topic: h5MarkData Partition: 0 Leader: 794 Replicas: 901,794 Isr: 794
- Topic: h5MarkData Partition: 1 Leader: 795 Replicas: 794,795 Isr: 795,794
- Topic: h5MarkData Partition: 2 Leader: 795 Replicas: 795,901 Isr: 795,901
SparkStreaming程序从Kafka读数据的程序运行期间报了如下异常:
org.apache.spark.SparkException: ArrayBuffer(org.apache.spark.SparkException: Couldn't find leaders for Set这个异常意思是Spark找不到partition的Leader。查看监控后发现,在异常发生的时间点,有一个Broker挂掉了。可是对应Topic的replica设置的2,就算挂掉一个,应该有replica顶上啊。后来发现,这是由于存在Partition的Replica没有跟Leader保持同步更新,也就是通常所说的“没追上”。 查看某个Topic是否存在没追上的情况:
kafka-topics.sh --describe --zookeeper XXX --topic XXX
观察其中的Replicas和Isr是否一致,如果出现Isr少于Replicas,则对应Partition存在没追上的情况
解决方法:
增大num.replica.fetchers的值,此参数是Replicas从Leader同步数据的线程数,默认为1,增大此参数即增大了同步IO。经过测试,增大此值后,不再有追不上的情况
确定问题已解决的方法:
启动出现问题的SparkStreaming程序,在程序正常计算的状态下,kill掉任意一个Broker后,再观察运行情况。在增大同步线程数之前,kill后SparkStreaming会报同样的异常,而增大后程序依然正常运行,问题解决。