簡體   English   中英

Kafka Connect 無法將自定義存儲接收器分區器投射到分區器接口

[英]Kafka Connect cannot cast custom storage sink partitioner to Partitioner interface

我需要為 kafka 連接S3 接收器插件創建一個自定義分區 我已經使用kotlin在自定義類中擴展了 HourlyPartitioner:

class RawDumpHourlyPartitioner<T> : HourlyPartitioner<T>() {
...
}

並相應地更改了我的連接器配置以使用自定義類:

"partitioner.class": "co.myapp.RawDumpHourlyPartitioner",

然后我創建了我們的 jar(我們使用了shadow )並將它包含在一個基於 kafka 連接鏡像的自定義 docker 鏡像中(鏡像版本與我們在項目中使用的依賴項相同):

FROM gradle:6.0-jdk8 as builder
WORKDIR /app
ADD . .
RUN gradle clean shadowJar

FROM confluentinc/cp-kafka-connect:5.3.2

COPY --from=builder /app/build/libs/kafka-processor-0.1-all.jar /usr/share/java/kafka/kafka-processor.jar

當連接器啟動時,我收到此錯誤:

ERROR WorkerSinkTask{id=staging-raw-dump-0} Task threw an uncaught and unrecoverable exception (org.apache.kafka.connect.runtime.WorkerTask)
java.lang.ClassCastException: co.myapp.RawDumpHourlyPartitioner cannot be cast to io.confluent.connect.storage.partitioner.Partitioner

為了仔細檢查,我創建了一個嘗試實例化類的 java 文件,但它沒有拋出任何錯誤:

import io.confluent.connect.storage.partitioner.Partitioner;

public class InstantiateTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<? extends Partitioner<?>> partitionerClass =
                (Class<? extends Partitioner<?>>) Class.forName("co.myapp.RawDumpHourlyPartitioner");

        Partitioner<?> partitioner = partitionerClass.newInstance();
    }
}

查看 kafka 連接指南,它說:

Kafka Connect 插件只是一組 JAR 文件,Kafka Connect 可以在其中找到一個或多個連接器、轉換和/或轉換器的實現。 Kafka Connect 將每個插件彼此隔離,以便一個插件中的庫不受任何其他插件中的庫的影響。 這在混合和匹配來自多個提供商的連接器時非常重要。

這意味着,由於我使用的是 S3 接收器連接器,因此我必須將帶有自定義分區器的 jar 放在 S3 插件的目錄中。

將 jar 文件移動到/usr/share/java/kafka-connect-s3解決了這個問題

在我提到的評論中,我的 jar 還包含我們在主 kafka-connect 配置(環境變量)中使用的自定義主題名稱策略,在這種情況下,jar 需要位於/usr/share/java/kafka文件夾

更新:正如cricket_007提到的,最好將自定義分區器 jar 放入/usr/share/java/kafka-connect-storage-common文件夾中,這是所有其他分區器所在的位置

根據您使用的 Sink,我們需要將分區器類推送到那里,就像我們使用 Confluent Kafka 5.5 和連接器類 Azure Gen2 存儲一樣。

為此,我們需要編寫類似於Github 中的 Repo 的自定義分區器。

然后我們將自定義 JAR 放在以下路徑中:

/usr/share/confluent-hub-components/confluentinc-kafka-connect-azure-data-lake-gen2-storage/lib/ 

之后我們的連接器類成功運行!

暫無
暫無

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

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