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

时间:2016-12-21 01:25:05

标签: docker apache-kafka 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

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

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

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

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

更新

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

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

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

2 个答案:

答案 0 :(得分:4)

我遇到的问题与你的情况相同。

  1. 为主题配置Task.max,分布式工作人员自动决定哪些节点处理主题。因此,如果群集中有3个工作人员,并且您的主题配置显示task.max = 2,则3个工作人员中只有2个将处理该主题。从理论上讲,如果其中一个工人失败,第三个应该承担工作量。但..
  2. 分布式连接器结果非常不可靠:一旦你添加\删除一些节点,群集就崩溃了,所有工人什么也没做,只是试图选择领导者而失败了。解决问题的唯一方法是重新启动整个集群,最好是同时重启所有工作人员。
  3. 我选择了另一种方式 - 我使用了独立工作者,它对我来说就像一个魅力,因为负载的分配是在Kafka客户端级别上实现的,一旦某个工作人员丢弃,集群会自动重新平衡,客户端会连接到未占用的主题。 / p>

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

答案 1 :(得分:0)

Kafka Connect has moved on a lot in three years起,我正在发布一个老问题的答案。

在最新版本(2.3.1)中,有 incremental rebalancing 可以大大改善Kafka Connect的行为。

还值得注意的是,在配置Kafka Connect rest.advertised.host.name时必须正确设置,好像不是那样,您会看到包括引号在内的错误

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

有关更多详细信息,请参见this post