[英]Kafka Connect S3 sink connector with custom Partitioner strange behavior
[英]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.