簡體   English   中英

第二個和第三個分布式 Kafka 連接器工作人員無法正常工作

[英]Second and Third Distributed Kafka Connector workers failing to work correctly

使用 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 請求,當我只需要在一個工作人員上運行它一次,然后該連接器的任務將自動分配給其他工人。 如果是這種情況,我該如何分配任務? 我目前將最大值設置為三個,但似乎只有一個在單個工人上運行。

更新

我最終使用 Yuri 建議的基本相同的方法讓事情運行起來。 我給每個工人一個唯一的組 ID,然后給每個連接器任務賦予相同的名稱。 這允許三個連接器及其單個任務共享一個偏移量,因此在接收器連接器的情況下,它們從 Kafka 消費的消息不會重復。 它們基本上作為獨立的連接器運行,因為工作人員具有不同的組 ID,因此不會相互通信。

如果連接器工作人員具有相同的組 ID,則不能添加多個同名的連接器。 如果您為連接器指定不同的名稱,它們將具有不同的偏移量並消耗重復的消息。 如果您在同一組中有三個工作人員,一個連接器和三個任務,那么理論上您將擁有一個理想的情況,其中任務共享一個偏移量,並且工作人員確保任務始終運行且分布良好(每個任務消耗一個獨特的集合分區)。 在實踐中,連接器框架不會創建多個任務,即使 tasks.max 設置為 3 並且當主題任務消耗有 25 個分區時也是如此。

如果有人知道我為什么會看到這種行為,請告訴我。

我在和你一樣的情況下遇到過類似的問題。

  1. Task.max 是為一個主題配置的,分布式工作者會自動決定哪些節點處理主題。 因此,如果集群中有 3 個工作人員,並且您的主題配置顯示 task.max=2,那么只有 3 個工作人員中的 2 個將處理該主題。 理論上,如果其中一名工人失敗,第三名應該承擔工作量。 但..
  2. 結果證明分布式連接器非常不可靠:一旦你添加\\刪除了一些節點,集群就會崩潰,所有的工作人員什么都不做,只是試圖選擇領導者,但失敗了。 唯一的解決方法是重啟整個集群,最好是同時重啟所有工作人員。

我選擇了另一種方式——我使用了獨立的 worker,它對我來說很有吸引力,因為負載分配是在 Kafka 客戶端級別實現的,一旦某個 worker 掉線,集群會自動重新平衡,客戶端連接到未占用的主題。

附注。 也許它對你也有用。 Confluent 連接器不能容忍與主題模式不匹配的無效負載。 一旦連接器收到一些無效消息,它就會默默地死掉。 找出答案的唯一方法是分析指標。

我發布了一個老問題的答案,因為Kafka Connect 在三年內取得了很大進展

在最新版本 (2.3.1) 中, 增量重新平衡大大改善了 Kafka Connect 的行為。

還值得注意的是,在配置 Kafka Connect rest.advertised.host.name必須正確設置rest.advertised.host.name ,如果不是這樣你會看到錯誤,包括引用的那個

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

有關更多詳細信息,請參閱此帖子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM