ClassLoading in Kafka Connect 3.3

时间:2018-02-15 09:33:07

标签: apache-kafka classloader apache-kafka-connect

我们修改了Kafka Connect JDBC以支持自定义转换器,该转换器将单个SinkRecord转换为多个SinkRecord,以支持事务插入。创建接收器时,可以在配置属性中指定实现SinkRecordConverter

的类

然后,我们尝试使用此自定义转换器的实现来打包超级jar,我们尝试以两种方式部署它:

  1. 我们放在kafka-connect-jdbc
  2. 的同一个文件夹中
  3. 我们将connect-distributed.properties中的plugins.path修改为/ usr / local / share / java,我们将转换器放在/usr/local/share/java/myconverter/myconverter-1.0.jar
  4. 然后我们尝试部署接收器,但在这两种情况下,尝试通过反射创建此转换器实例的代码都失败并显示java.lang.ClassNotFoundException.

    我们尝试通过在两种情况下放置出现问题的断点来调试类加载问题:

    • 在第一种情况下,jar将显示为URLClasspath
    • 上的一个jar
    • 在第二种情况下,它甚至不会显示为URLClasspath
    • 上的其中一个罐子

    将自定义转换器添加到kafka-connect-jdbc的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我们有两个问题:

  1. 要装配我们使用名为oneJar的SBT插件的jar,它会创建一个自定义类加载器
  2. 我们需要从现有的kafka连接器(jdbc)中访问这些类,而不是仅从kafka-connect访问。
  3. 我们找到的解决方案如下:

    • 我们放弃了超级jar,我们使用sbt pack在kafka-connect实例上部署了所有的lib。
    • 我们将罐子放在kafka-connect-jdbc所在的同一文件夹