Kafka Connect无法将自定义存储接收器分区程序转换为分区程序界面

时间:2020-02-13 01:04:05

标签: java kotlin apache-kafka apache-kafka-connect

我需要为kafka connect S3 sink plugin创建一个自定义分区程序。 我已经使用kotlin在自定义类中扩展了HourlyPartitioner

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

并相应地更改了我的连接器配置,以使用自定义类:

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

然后我创建了jar(我们使用shadow)并将其包含在基于kafka connect映像的自定义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();
    }
}

2 个答案:

答案 0 :(得分:1)

看看kafka connect guide,它说:

Kafka Connect插件只是一组JAR文件,Kafka Connect可以在其​​中找到一个或多个连接器,转换和/或转换器的实现。 Kafka Connect将每个插件相互隔离,以使一个插件中的库不受任何其他插件中的库影响。当混合和匹配来自多个提供程序的连接器时,这一点非常重要。

这意味着,由于我正在使用S3接收器连接器,因此必须将带有自定义分区程序的jar放在S3插件的目录中。

将jar文件移至/usr/share/java/kafka-connect-s3解决了该问题

在评论中,我提到我的jar还包含一个自定义主题名称策略,我们在主kafka-connect配置(env变量)中使用了该主题,在这种情况下,该jar必须位于{{1} }文件夹

更新:如cricket_007所述,最好将自定义分区jar放入所有其他分区所在的/usr/share/java/kafka文件夹中

答案 1 :(得分:0)

根据您使用的 Sink,我们需要将分区器类推送到那里,就像我们使用 Confluent Kafka 5.5 和连接器类 Azure Gen2 存储一样。

为此,我们需要编写类似于以下 Repo in Github 的自定义分区器。

然后我们将自定义 JAR 放在以下路径中:

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

之后我们的连接器类成功运行!