将 Kafka 连接嵌入 Ksqldb-server 时挂载(卷)不起作用

Posted

技术标签:

【中文标题】将 Kafka 连接嵌入 Ksqldb-server 时挂载(卷)不起作用【英文标题】:Mount (Volumes) not working when embedding Kafka connect into Ksqldb-server 【发布时间】:2021-09-28 04:58:03 【问题描述】:

尝试在 Ksqldb 服务器中嵌入 Kafka 连接器时,“卷”映射似乎不起作用

下面是我的 docker 文件

ksqldb-server:
        image: confluentinc/ksqldb-server:0.18.0
        hostname: ksqldb-server
        container_name: ksqldb-server
        depends_on:
          - broker
          - schema-registry
        ports:
          - "8088:8088"
        volumes:
          - "/usr/local/share/kafka/connectors/debezium-debezium-connector-mysql/lib:/usr/share/kafka/plugins/"
        environment:
          KSQL_LISTENERS: "http://0.0.0.0:8088"
          KSQL_BOOTSTRAP_SERVERS: "broker:9092"
          KSQL_KSQL_SCHEMA_REGISTRY_URL: "http://schema-registry:8081"
          KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
          KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
          # Configuration to embed Kafka Connect support.
          KSQL_CONNECT_GROUP_ID: "ksql-connect-cluster"
          KSQL_CONNECT_BOOTSTRAP_SERVERS: "broker:9092"
          KSQL_CONNECT_KEY_CONVERTER: "org.apache.kafka.connect.storage.StringConverter"
          KSQL_CONNECT_VALUE_CONVERTER: "io.confluent.connect.avro.AvroConverter"
          KSQL_CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: "http://schema-registry:8081"
          KSQL_CONNECT_CONFIG_STORAGE_TOPIC: "_ksql-connect-configs"
          KSQL_CONNECT_OFFSET_STORAGE_TOPIC: "_ksql-connect-offsets"
          KSQL_CONNECT_STATUS_STORAGE_TOPIC: "_ksql-connect-statuses"
          KSQL_CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
          KSQL_CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
          KSQL_CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
          KSQL_CONNECT_PLUGIN_PATH: "/usr/share/kafka/plugins"

我在尝试使用连接器创建源时看到以下错误

“错误代码”:500, “消息”:“找不到任何实现连接器且名称与 io.debezium.connector.mysql.MySqlConnector 匹配的类,可用的连接器是:.......”

我确实在“/usr/local/share/kafka/connectors/debezium-debezium-connector-mysql/lib”文件夹中本地安装了所需的 jar 文件,正如上面 docker 文件中的卷中所映射的那样。

我错过了什么?

非常感谢

【问题讨论】:

非嵌入式连接服务器能用吗? 另外,坐骑工作正常。插件扫描器/路径配置可能不正确,您应该会看到说明容器启动时扫描了哪些插件的日志 你能分享你的用户挂载的“ls -a”吗? "ls -a" 结果如下 - 。 .. antlr4-runtime-4.7.2.jar debezium-connector-mysql-1.1.0.Final.jar debezium-ddl-parser-1.1.0.Final.jar mysql-connector-java-8.0.16.jar debezium- api-1.1.0.Final.jar debezium-core-1.1.0.Final.jar mysql-binlog-connector-java-0.19.1.jar 它适用于非嵌入式连接服务器。我可以登录到 docker 容器并浏览文件夹。 (docker exec -it ksqldb-server bash)。我找不到包含插件文件夹链接的文件。 ksqldb-server 容器中似乎缺少 connect-distributed.properties。 【参考方案1】:

下载连接器 zip 文件后,使用 plugin.path 配置属性将其文件解压缩到工作器配置(例如 connect-distributed.properties)中的插件路径中。例如,假设您已下载 Debezium MySQL 连接器存档并将其内容提取到 /kafka/connect/debezium-connector-mysql。然后,您将在工作人员配置中指定以下内容:

plugin.path=/kafka/connect

因此,在您安装到内部路径的情况下,连接器插件需要位于另一个文件夹中,而不是直接安装在插件路径中

【讨论】:

我尝试了以下 - 似乎仍然得到同样的错误。卷:-“/usr/local/share/kafka/connectors/:/usr/share/kafka/plugins/” 您的 jar 似乎在 lib 中,并且目录不称为 debezium-connector-mysql-1.6.0.Final-plugin,尝试再次下载连接器,从目录中删除其他文件,然后在那里提取它 保持目录树在tar文件中,不要改变任何东西 我重新安装了插件并将 docker compose 文件更改为支持它。我仍然看到同样的错误。 volumes: - "/usr/local/share/kafka/connectors/debezium-debezium-connector-mysql/lib/:/usr/share/kafka/plugins/" 也实现了——connect.properties是根据环境变量生成的在 docker compose 文件中指定。所以这一行 => KSQL_CONNECT_PLUGIN_PATH: "/usr/share/kafka/plugins" 是我们要求 KsqlDB 服务器查找连接器的地方,并在卷中将其映射到运行 docker 的本地机器上的文件。 这不是我建议你做的...... debezium网站上有关于如何安装连接器的明确说明,请尝试遵循【参考方案2】:

下面的映射对我有用

volumes:
          - "./confluent-hub-components/:/usr/share/kafka/plugins/"

可能的答案是 - 对于文件夹“/usr/local/share/kafka/connectors/”,可能存在权限相关问题,因此映射在 docker compose 文件中不起作用。使用上面的新文件夹(不在 /usr 根文件夹中),映射工作。

【讨论】:

以上是关于将 Kafka 连接嵌入 Ksqldb-server 时挂载(卷)不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Debezium Kafka 连接器 mongodb:将 kafka 连接器连接到 mongodb 时出错

将 Pyspark 与 Kafka 连接起来

集成测试之嵌入式Kafka

给kafka配置外部连接

无法将 Kafka 与 InfluxDB Sink Connector 连接

带有 kafka 的 Debezium 还是只有嵌入式 Debezium?