簡體   English   中英

org.apache.kafka.common.errors.TimeoutException:使用 jaas SASL 配置身份驗證獲取 Kafka 集群的主題元數據時超時

[英]org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata for Kafka Cluster using jaas SASL config authentication

我正在嘗試部署一個 Google Cloud Dataflow 管道,該管道從 Kafka 集群中讀取數據,處理其記錄,然后將結果寫入 BigQuery。 但是,我在嘗試部署時不斷遇到以下異常:

org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata for Kafka Cluster

Kafka 集群需要使用 JAAS 配置進行身份驗證,我使用下面的代碼設置 KafkaIO.read Apache Beam 方法所需的屬性:

// Kafka properties
    Map<String, Object> kafkaProperties = new HashMap<String, Object>(){{
        put("request.timeout.ms", 900000);
        put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_PLAINTEXT");
        put(SaslConfigs.SASL_MECHANISM, "SCRAM-SHA-512");
        put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"USERNAME\" password=\"PASSWORD\";");
        put(CommonClientConfigs.GROUP_ID_CONFIG, GROUP_ID);
    }};

    // Build & execute pipeline
    pipeline
            .apply(
                    "ReadFromKafka",
                    KafkaIO.<Long, String>read()
                            .withBootstrapServers(properties.getProperty("kafka.servers"))
                            .withKeyDeserializer(LongDeserializer.class)
                            .withValueDeserializer(StringDeserializer.class)
                            .withTopic(properties.getProperty("kafka.topic")).withConsumerConfigUpdates(kafkaProperties))

Dataflow 管道將在禁用公共 IP 的情況下部署,但從我們的 Google Cloud VPC 網絡到 Kafka 集群已建立 VPN 隧道,並且配置了雙方私有 ip 所需的路由,並將它們的 IP 列入白名單。 我能夠使用與要部署的 Dataflow 作業位於同一 VPN 子網中的 Compute Engine 虛擬機 ping 並連接到 Kafka 服務器的套接字。

我當時認為配置存在問題,但我無法確定我是否缺少其他字段,或者現有字段之一是否配置錯誤。 有誰知道我如何進一步診斷問題,因為拋出的異常並沒有真正確定問題? 任何幫助將不勝感激。

編輯:我現在能夠成功部署 Dataflow 作業,但是看起來好像讀取功能不正常。 在查看日志檢查Dataflow作業中的錯誤后,我可以看到在發現kafka主題的組協調器后,在警告日志語句之前沒有其他日志語句說關閉空閑閱讀器超時:

Close timed out with 1 pending requests to coordinator, terminating client connections

隨后是一個未捕獲的異常,其根本原因是:

org.apache.kafka.common.errors.TimeoutException: Timeout of 60000ms expired before the position for partition test-partition could be determined

然后有一個錯誤說明:

Execution of work for P0 for key 0000000000000001 failed. Will retry locally.

由於 Kafka 主題實際上在消息中沒有鍵,這可能是鍵定義的問題嗎? 當我在 Kafka Tool 中查看主題時,在數據中觀察到的唯一列包括 Offset、Message 和 Timestamp。

根據最后一條評論,我假設您在執行 Dataflow 作業運行程序與 Kafka 代理的連接方面遇到的問題更多的是網絡堆棧,然后是最初尋找 Dataflow 管道中缺少的任何配置。

基本上,當您為 Dataflow 工作人員使用公共 IP地址池時,您有一種最簡單的方式來訪問外部 Kafka 集群,而無需在雙方之間應用額外的配置,因為您不需要在各方之間啟動VPC 網絡並執行例行網絡作業以讓所有路線工作。

但是, Cloud VPN帶來了更多的復雜性,在雙方實現 VPC 網絡以及進一步調整此 VPC 的 VPN 網關、轉發規則和地址池。 相反,從 Dataflow 運行時的角度來看,您不需要在 Dataflow 運行器之間傳播公共 IP 地址,並且無疑會降低價格。

您提到的主要問題在於 Kafka 集群方面。 由於Apache Kafka是一個分布式系統,它的核心原理是:當生產者/消費者執行時,它會請求關於哪個 broker 是分區領導者的元數據,接收具有該分區可用端點的元數據,從而客戶端然后確認這些端點連接到特定的代理。 據我了解,在您的情況下,與領導者的連接是通過綁定到外部網絡接口的偵聽器執行的,在server.properties代理設置中配置。

因此,您可以考慮在綁定到雲 VPC 網絡接口的listeners器中創建一個單獨的偵聽器(如果它不存在),並在必要時傳播帶有返回客戶端的元數據的advertised.listeners ,包括用於連接到特定代理的數據.

暫無
暫無

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

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