如何为debezium/connect docker镜像添加自定义transformation并排查加载错误
可能的问题及排查方向:
- 镜像复制的插件目录结构不符合要求
Kafka Connect的插件加载规则要求:每个插件单独对应CONNECT_PLUGIN_PATH下的一级子目录,子目录内直接存放插件所有依赖jar包,不能有多层嵌套。你需要确认Dockerfile里COPY的本地MergeField目录,复制到容器后路径为/kafka/plugins/MergeField/下直接就是你打的自定义jar包,而非/kafka/plugins/MergeField/target/xxx.jar这种嵌套结构。 - 配置的类全限定名和实际包名不匹配
你连接器配置中写的类是org.apache.kafka.connect.transforms.MergeField$Value,需要先解压自定义jar包,检查内部目录结构是否和配置的包名完全对应,是否存在MergeField$Value这个内部类的class文件。很多开发者自定义插件时会用个人/企业专属包名,和配置中写的官方包名不一致,就会触发类找不到的错误。 - 包名冲突导致类加载异常
org.apache.kafka.connect.transforms是Kafka官方转换类的默认包名,你自定义类如果用了相同的包名,会和镜像/kafka/connect目录下自带的官方jar包产生类加载冲突,Connect会优先加载官方包路径下的类,找不到你自定义的实现。建议把自定义类的包名改为非org.apache.kafka开头的专属命名空间,避免冲突。 - 自定义类没有实现正确的接口
就算类被正常加载,如果你的MergeField$Value类没有继承org.apache.kafka.connect.transforms.Transformation接口,也会触发报错里的Not a Transformation提示。 - 镜像构建缓存导致jar包未更新
如果后续修改过自定义jar包,构建镜像时没有加--no-cache参数,可能会复用旧的镜像层,导致容器内的jar包不是最新版本。可以exec进入运行的connect容器,执行ls /kafka/plugins/MergeField和jar tf 你的jar包路径 | grep MergeField命令,确认jar包和内部类文件存在。
内容的提问来源于stack exchange,提问作者user3738017
相关产品推荐
相关产品推荐

