我需要为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();
}
}
答案 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/
之后我们的连接器类成功运行!