第二和第三个分布的Kafka Connector工作人员无法正常工作

在Kafka集群3和Zookeeper集群相同的情况下,我创build了一个分布式连接器节点。 使用单个任务成功运行此节点。 然后我提出了第二个连接器,这似乎是运行的任务中的一些代码肯定跑了。 然而,它似乎并没有活下去(尽pipe没有错误抛出,没有保持活着是由缺乏预期的活动,而第一个连接器继续正常运行)。 当我在每个连接器节点上调用URL http://localhost:8083/connectors/mqtt/tasks ,它会告诉我连接器有一个任务。 我期望这是两个任务,每个节点/工作人员一个。 (目前工作人员configuration说tasks.max = 1但我也尝试将其设置为3。

当我尝试启动第三个连接器时,出现错误:

 "POST /connectors HTTP/1.1" 500 90 5 (org.apache.kafka.connect.runtime.rest.RestServer:60) ERROR IO error forwarding REST request: (org.apache.kafka.connect.runtime.rest.RestServer:241) java.net.ConnectException: Connection refused 

试图再次从shell调用连接器POST方法返回错误:

  {"error_code":500,"message":"IO Error trying to forward REST request: Connection refused"} 

我也尝试升级到今天发布的Apache Kafka 0.10.1.1。 我仍然看到问题。 每个连接器都运行在由单个映像定义的独立Docker容器上。 他们应该是相同的。

问题可能是我试图运行POST请求到每个worker上的http://localhost:8083/connectors ,当我只需要在单个worker上运行一次,然后该连接器的任务将自动分发给其他工人。 如果是这种情况,我如何获得分配的任务? 我目前有最多三个,但只有一个似乎是在一个单一的工作人员上运行。

更新

我最终用Yuribuild议的方法运行。 我给每个工人一个唯一的组ID,然后给每个连接器任务相同的名称。 这允许三个连接器和他们的单个任务共享一个偏移量,所以在接收器连接器的情况下,他们从卡夫卡消耗的消息不会被复制。 他们基本上是作为独立的连接器运行,因为工人有不同的组ID,因此不会相互通信。

如果连接器工作人员具有相同的组ID,则不能添加具有相同名称的多个连接器。 如果给连接器不同的名称,他们将有不同的偏移量,并消耗重复的消息。 如果同一组中有三名工作人员,一个连接器和三个任务,那么从理论上讲,理想情况下,任务共享一个偏移量,工作人员确保任务始终运行并且分布良好(每个任务都消耗一个唯一的集合的分区)。 在实践中,连接器框架不会创build多个任务,即使task.max设置为3,并且主题任务消耗时也有25个分区。

如果有人知道我为什么看到这种行为,请告诉我。

我遇到过和你一样的情况。

  1. Task.max为主题configuration,分布式工作人员自动决定哪些节点处理主题。 所以,如果你在一个集群中有三个工人,你的主题configuration是task.max = 2,那么只有三个工人中的两个将处理这个主题。 从理论上讲,如果一个工人失败了,第三个工人就应该承担工作量。 但..
  2. 分布式连接器是非常不可靠的:一旦你添加\删除一些节点,集群崩溃,所有的工人什么也没做,只是试图select领导而失败。 唯一的解决办法是重新启动整个群集,最好同时启动所有的工作。

我select了另外一种方式 – 我使用了独立工作者,因为它对我来说就像是一种魅力,因为负载的分配是在Kafka客户端级别上实现的,而且一旦某个工作者下降,集群将自动重新平衡,客户端连接到未占用的主题。

PS。 也许这对你也是有用的。 Confluent连接器不能容忍与主题模式不匹配的无效负载。 一旦连接器收到一些无效的消息,就会自动死亡。 找出的唯一方法是分析指标。