Kafka Connect未能启动

Dev*_*Dev 3 apache-kafka confluent apache-kafka-connect

我在新的linux centos 7上安装了kafka confluent oss 4.0,但是kafka connect无法启动.

重现步骤 :

 - Install Oracle JDK 8
 - Copy confluent-4.0.0 folder on opt/confluent-4.0.0
 - Run /opt/confluent-4.0.0/confluent start
Run Code Online (Sandbox Code Playgroud)

结果:

Starting zookeeper
zookeeper is [UP]
Starting kafka
kafka is [UP]
Starting schema-registry
schema-registry is [UP]
Starting kafka-rest
kafka-rest is [UP]
Starting connect
\Kafka Connect failed to start
connect is [DOWN]
Run Code Online (Sandbox Code Playgroud)

错误日志(connect.stderr):

Exception in thread "main" java.lang.NoClassDefFoundError: io/confluent/connect/storage/StorageSinkConnectorConfig
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
        at org.apache.kafka.connect.runtime.isolation.PluginClassLoader.loadClass(PluginClassLoader.java:54)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getConstructor0(Class.java:3075)
        at java.lang.Class.newInstance(Class.java:412)
        at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.getPluginDesc(DelegatingClassLoader.java:279)
        at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanPluginPath(DelegatingClassLoader.java:260)
        at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.scanUrlsAndAddPlugins(DelegatingClassLoader.java:201)
        at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.registerPlugin(DelegatingClassLoader.java:193)
        at org.apache.kafka.connect.runtime.isolation.DelegatingClassLoader.initLoaders(DelegatingClassLoader.java:153)
        at org.apache.kafka.connect.runtime.isolation.Plugins.<init>(Plugins.java:47)
        at org.apache.kafka.connect.cli.ConnectDistributed.main(ConnectDistributed.java:70)
Caused by: java.lang.ClassNotFoundException: io.confluent.connect.storage.StorageSinkConnectorConfig
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at org.apache.kafka.connect.runtime.isolation.PluginClassLoader.loadClass(PluginClassLoader.java:62)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 22 more
Run Code Online (Sandbox Code Playgroud)

其他信息:

Java版本:

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode
Run Code Online (Sandbox Code Playgroud)

Centos版本:

centos-release-7-4.1708.el7.centos.x86_64
Run Code Online (Sandbox Code Playgroud)

[编辑:30/11/2017]在每个属性文件中编辑plugin.path变量并没有解决问题.

包含'plugin.path'变量的文件列表:

./etc/schema-registry/connect-avro-distributed.properties:84:plugin.path=/opt/confluent-4.0.0/share/java
./etc/schema-registry/connect-avro-standalone.properties:51:plugin.path=/opt/confluent-4.0.0/share/java
./etc/kafka/connect-distributed.properties:95:plugin.path=/opt/confluent-4.0.0/share/java
./etc/kafka/connect-standalone.properties:50:plugin.path=/opt/confluent-4.0.0/share/java
Run Code Online (Sandbox Code Playgroud)

Kon*_*sis 7

使用Confluent 4.0.0,默认情况下为Kafka Connect启用使用plugin.path的类加载隔离.

当您从中安装Confluent Platform debrpm打包时,您的默认位置plugin.path是事先已知的.

但是,当你下载并解压ziptar.gz汇合平台的地方在文件系统中的档案,它的设置为:

plugin.path=share/java

这是一个相对路径,因为当您将Confluent Platform下载为存档(ziptar.gz)时,您提取存档的位置是未知的(在上面的示例中/opt/confluent-4.0.0/).

如果从提取Confluent平台的目录运行CLI或Connect的bin脚本,则可以猜测此位置:

例如,在上面的例子中:

cd /opt/confluent-4.0.0

./bin/confluent start

为了能够从文件系统中的任何目录启动Connect,假设binConfluent Platform的目录在您的目录中PATH,则需要将该属性设置为plugin.path插件的绝对路径位置:

要使用Confluent CLI编辑:

etc/schema-registry/connect-avro-distributed.properties

并设置plugin.path适当的(此处plugin.path=/opt/confluent-4.0.0/share/java)

对于常规bin脚本编辑:

./etc/kafka/connect-distributed.properties

./etc/kafka/connect-standalone.properties

并设置plugin.path如上(再次,在您的示例:) plugin.path=/opt/confluent-4.0.0/share/java.