kafka connect rebalance时herder大概率异常

1. 发生场景

版本:confluent 2.0.0
如果因为some reason触发了task的rebalance,herder work可能发生异常,导致connect进程退出

2. 异常栈
[2016-06-28 17:22:59,934] ERROR Uncaught exception in herder work thread, exiting:  (org.apache.kafka.connect.runtime.distributed.DistributedHerder:166)
java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
        at org.apache.kafka.clients.consumer.KafkaConsumer.acquire(KafkaConsumer.java:1294)
        at org.apache.kafka.clients.consumer.KafkaConsumer.close(KafkaConsumer.java:1225)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.close(WorkerSinkTask.java:128)
        at org.apache.kafka.connect.runtime.Worker.stopTask(Worker.java:313)
        at org.apache.kafka.connect.runtime.distributed.DistributedHerder$14.onRevoked(DistributedHerder.java:898)
        at org.apache.kafka.connect.runtime.distributed.WorkerCoordinator.onJoinPrepare(WorkerCoordinator.java:236)
        at org.apache.kafka.clients.consumer.internals.AbstractCoordinator.ensureActiveGroup(AbstractCoordinator.java:207)
        at org.apache.kafka.connect.runtime.distributed.WorkerGroupMember.poll(WorkerGroupMember.java:142)
        at org.apache.kafka.connect.runtime.distributed.DistributedHerder.tick(DistributedHerder.java:266)
        at org.apache.kafka.connect.runtime.distributed.DistributedHerder.run(DistributedHerder.java:159)
        at java.lang.Thread.run(Thread.java:745)
[2016-06-28 17:22:59,936] INFO Kafka Connect stopping (org.apache.kafka.connect.runtime.Connect:68)
3. 异常分析
1. 线程模型

confluent存在两种worker:
(1)控制数据读写 的source/sink worker;
(2)负责协调source/sink worker的herder worker;
当rebalance发生时,herder会去主动close worker线程。

2. 关键方法

从栈中可以看出,在KafkaConsumer.acquire方法中抛出的异常,分析下该方法:
(1)本意:阻止多个线程对同一分区数据进行读写操作。
(2)实现手段:非阻塞锁的思路,用变量记录了当前的操作线程。一个线程来操作时,如果发现其他线程也在操作就退出。
这个控制手段很粗暴,它应该做的是“不许多个sink worker同时操作“。而不是一棒子全打死,不许所有线程操作。

3. 问题

herder 主动去杀sink worker,会操作Consumer。如果sink worker正在操作就会发生异常。

4. 解决办法
  1. herder close sink worker时,不要走acquire流程;
  2. herder close sink worker时,先等待一定时长(sleep或者加锁)
  3. 在V3.0.0 版本,框架上做了改动,herder 只是置位close标记,不错其他的操作。
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值