kafka connect rebalance时herder大概率异常

来源:互联网 发布:上海mao livehouse知乎 编辑:程序博客网 时间:2024/05/16 09:53

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标记,不错其他的操作。
0 0
原创粉丝点击