第二和第三个分布式Kafka Connector工作程序无法正常工作

Las*_*sus 10 apache-kafka docker apache-kafka-connect

使用3的Kafka集群和相同的Zookeeper集群,我提出了一个分布式连接器节点.此节点使用单个任务成功运行.然后我提出了第二个连接器,这似乎运行,因为任务中的一些代码肯定会运行.然而,它似乎没有活着(尽管没有抛出错误,由于缺乏预期的活动而没有保持活着,而第一个连接器继续正常运行).当我调用URL时http://localhost:8083/connectors/mqtt/tasks,在每个连接器节点上,它告诉我连接器有一个任务.我希望这是两个任务,每个节点/工作一个任务.(目前工作人员配置说,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
Run Code Online (Sandbox Code Playgroud)

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

 {"error_code":500,"message":"IO Error trying to forward REST request:
 Connection refused"}
Run Code Online (Sandbox Code Playgroud)

我还尝试升级到今天发布的Apache Kafka 0.10.1.1.我还在看问题.每个连接器都运行在由单个映像定义的隔离Docker容器上.它们应该完全相同.

问题可能是我正在尝试http://localhost:8083/connectors对每个工作程序运行POST请求,当我只需要在单个工作程序上运行一次,然后该连接器的任务将自动分发给其他工作程序.如果是这种情况,我该如何分配任务?我目前将max设置为3,但只有一个似乎在一个worker上运行.

更新

我最终使用与Yuri建议的方法基本相同的方式运行.我给每个工作者一个唯一的组ID,然后给每个连接器任务指定相同的名称.这允许三个连接器及其单个任务共享一个偏移量,因此在接收器连接器的情况下,它们从Kafka消耗的消息不会重复.它们基本上作为独立连接器运行,因为工作人员具有不同的组ID,因此不会相互通信.

如果连接器工作程序具有相同的组ID,则无法添加多个具有相同名称的连接器.如果为连接器指定不同的名称,它们将具有不同的偏移量并消耗重复的消息.如果同一组中有三个工作人员,一个连接器和三个任务,理论上理论情况是任务共享一个偏移量,工作人员确保任务始终在运行并且分布均匀(每个任务都使用一个唯一的集合分区).实际上,连接器框架不会创建多个任务,即使tasks.max设置为3,主题任务消耗时也有25个分区.

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

Yur*_*ian 5

我在与您相同的情况下遇到了类似的问题。

  1. 已为主题配置Task.max,并且分布式工作器会自动决定哪些节点处理主题。因此,如果集群中有3个工作进程,并且主题配置显示task.max = 2,那么3个工作进程中只有2个将处理该主题。从理论上讲,如果其中一名工人失败了,那么第三名工人应该承担更多的工作量。但..
  2. 事实证明,分布式连接器非常不可靠:添加/删除某些节点后,集群便崩溃了,所有工作人员都无计可施,只是试图选择领导者而失败了。修复的唯一方法是重新启动整个群集,最好同时重新启动所有工作线程。

我选择了另一种方式-我使用了独立工作程序,这对我来说就像是一种魅力,因为负载分配是在Kafka客户端级别上实现的,并且一旦某些工作程序掉线,集群就会自动重新平衡,并且客户端会连接到未占用的主题。

PS。也许对您也有用。融合连接器不容许与主题模式不匹配的无效负载。一旦连接器收到一些无效的消息,它就会死掉。找出答案的唯一方法是分析指标。