我已成功使用Java编写的简单自定义Partitioner类,用于Confluent 3.2.x(Kafka 0.10.x)上的Kafka Connect接收器。我想升级到Confluent 4.1(Kafka 1.1)并遇到错误。
Kafka Connect的插件加载机制似乎已在CP 3.3.0中进行了更改。以前,只有CLASSPATH选项,但CP 3.3.0+有一个更新的推荐plugin.path
机制。
如果我尝试继续使用旧版CLASSPATH插件机制,当我尝试使用我的插件时,我得到:
java.lang.ClassNotFoundException: io.confluent.connect.storage.partitioner.DefaultPartitioner
这是一个CP内部课程。使用较旧的CP 3.2.x,它在类路径上可用,但是在CP> = 3.3.0中使用新的类路径隔离工作,我认为必须与插件一起提供。
我认为切换到较新的推荐plugin.path
机制是明智之举。我删除了CLASSPATH条目。在默认/etc/kafka/connect-distributed.properties
中,我看到plugin.path=/usr/share/java
,因此我将插件.jar安装到/usr/share/java/my-custom-partitioner/my-custom-partitioner.jar
。我尝试过添加而不是在那里添加依赖.jar文件。
当Kafka Connect服务启动时,我的插件似乎已加载:
INFO Loading plugin from: /usr/share/java/my-custom-partitioner (org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader:194)
INFO Registered loader: PluginClassLoader{pluginLocation=file:/usr/share/java/my-custom-partitioner/} (org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader:217)
当我这样做时:
curl -X PUT -H "Content-Type: application/json" --data-binary "@sink_test_1.json" my-dev-test-vm:8083/connectors/sink-test-1/config
我明白了:
{"error_code":500,"message":null}%
我可以在kafka connect systemd log中看到:
java.lang.NullPointerException
at io.confluent.connect.storage.partitioner.PartitionerConfig.classNameEquals(PartitionerConfig.java:270)
at io.confluent.connect.storage.partitioner.PartitionerConfig.access$000(PartitionerConfig.java:33)
at io.confluent.connect.storage.partitioner.PartitionerConfig$PartitionerClassDependentsRecommender.visible(PartitionerConfig.java:238)
at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:617)
at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:625)
at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:525)
at org.apache.kafka.common.config.ConfigDef.validateAll(ConfigDef.java:508)
at org.apache.kafka.common.config.ConfigDef.validate(ConfigDef.java:490)
at org.apache.kafka.connect.connector.Connector.validate(Connector.java:133)
不明白出现了什么问题,或者为什么我的分区类没有正确加载。
仅供参考,我已经使用CP 4.1 + Kafka 1.1依赖重建了我的Java插件,并进行了小的更新以匹配API更改,例如将getSchemaGeneratorClass
的实现添加到我的分区器类。
答案 0 :(得分:1)
自定义Kafka Connect分区程序类不能通过旧的CLASSPATH机制工作,并且它们不能用作新的Kafka 0.11.0+隔离插件机制的插件。
唯一可行的解决方案是使用自定义Kafka Connect Partitioner类将自定义.jar文件复制到kafka-connect-storage-common
的{{1}}插件导演中。自定义Kafka Connect分区程序插件类必须存在于同一目录中,因此它们位于同一个隔离的类加载器中。
仅供参考,你可以看到Kafka 0.11.0+隔离插件机制只会加载四个特定的Java类的子类,这些类没有覆盖Kafka Connect分区器:
感谢cricket_007推荐这个确切的解决方案:将自定义Kafka Connect分区器.jar文件放在/usr/share/java/kafka-connect-storage-common/
目录中。我很清楚地知道为什么要这样做以及为什么替代方案不起作用。