【问题标题】:Kafka Connect JDBC Sink Connector - java.sql.SQLException: No suitable driver foundKafka Connect JDBC Sink 连接器 - java.sql.SQLException:找不到合适的驱动程序
【发布时间】:2020-03-17 07:00:42
【问题描述】:

我正在尝试在 docker 的帮助下使用 kafka debezium(Kafka 流式传输)将表数据从一个 DB 下沉到另一个 DB。 数据库流工作正常。但是流数据接收另一个 MySQL DB 进程出错。

对于我的连接器接收器配置如下。

 {
  "name": "mysql_sink",
  "config": {
    "connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
    "topics": "mysql-connect.kafka_test.employee",
    "connection.url": "jdbc:mysql://localhost/kafka_test_1&user=debezium&password=xxxxx",
    "auto.create": "true",
    "auto.evolve": "true",
    "insert.mode": "upsert",
    "pk.fields": "id",
    "pk.mode": "record_value",
    "errors.tolerance": "all",
    "errors.log.enable":"true",
    "errors.log.include.messages":"true",
    "key.converter": "org.apache.kafka.connect.json.JsonConverter",
    "value.converter": "org.apache.kafka.connect.json.JsonConverter",
    "key.converter.schemas.enable": "false",
    "value.converter.schemas.enable": "false",
    "name": "mysql_sink"
  }
}

但我遇到了一个错误。

org.apache.kafka.connect.errors.ConnectException: Exiting WorkerSinkTask due to unrecoverable exception.
org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:560)
org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:321)
org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:224)
org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:192)
org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:175)
org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:219)
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
java.util.concurrent.FutureTask.run(FutureTask.java:266)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
java.lang.Thread.run(Thread.java:748)\nCaused by: org.apache.kafka.connect.errors.ConnectException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/kafka_test_1&user=debezium&password=xxxxx
io.confluent.connect.jdbc.util.CachedConnectionProvider.getValidConnection(CachedConnectionProvider.java:59)
io.confluent.connect.jdbc.sink.JdbcDbWriter.write(JdbcDbWriter.java:52)
io.confluent.connect.jdbc.sink.JdbcSinkTask.put(JdbcSinkTask.java:66)
org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:538)\n\t... 10 more\nCaused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/kafka_test_1&user=debezium&password=xxxxx
java.sql.DriverManager.getConnection(DriverManager.java:689)
java.sql.DriverManager.getConnection(DriverManager.java:247)
io.confluent.connect.jdbc.util.CachedConnectionProvider.newConnection(CachedConnectionProvider.java:66)
io.confluent.connect.jdbc.util.CachedConnectionProvider.getValidConnection(CachedConnectionProvider.java:52)\n\t... 13 more

我正在使用 docker。

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
     - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    command: [start-kafka.sh]
    ports:
     - "9092:9092"
    links:
     - zookeeper
    environment:
      KAFKA_LISTENERS: PLAINTEXT://:9092,
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    depends_on:
      - zookeeper
  connect:
    build:
      context: debezium-jdbc
    ports:
     - "8083:8083"
    links:
     - kafka
    environment:
      BOOTSTRAP_SERVERS: kafka:9092
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: my_connect_configs
      OFFSET_STORAGE_TOPIC: my_connect_offsets
      CLASSPATH: /kafka/connect/kafka-connect-jdbc-5.3.1.jar

我尝试了很多东西,我不知道为什么会出现这个错误,还有一件事我不了解 java。

提前致谢。

【问题讨论】:

  • 相关错误:"Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/kafka_test_1&user=debezium&password=xxxxx", in other类路径中没有 MySQL 连接器/J 驱动程序或驱动程序未加载的话
  • plugins.path 在您的server.properties 文件中的配置是什么?
  • @GiorgosMyrianthous 我在这里检查了 server.properties plugins.path 从未提及。另一件事 Initial io.debezium.connector.mysql.MySqlConnector 工作正常。但是io.confluent.connect.jdbc.JdbcSinkConnector 只会出错。
  • @MarkRotteveel 我在将 Kafka 数据流式传输到 MySQL DB 时遇到了这个问题。 io.debezium.connector.mysql.MySqlConnector 工作正常。
  • 这个问题是重复的,但链接到的答案没有帮助。我已投票重新打开它,同时我可以推荐confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector 提供的有关此错误的详细信息。

标签: apache-kafka apache-kafka-connect confluent-platform


【解决方案1】:

在尝试使用 kafka connect 加载 mysql 表时,我一直在努力处理相同的错误 No suitable driver found

我正在使用 kakfa(不是 confluent 平台),发现您可能会遇到两个问题:

  • jdbc url 格式错误
  • 为您的 kafka 选择的驱动程序不正确。

我使用了最新的驱动程序mysql-connector-java-8.0.21 并收到没有合适的驱动程序错误。但是,当我切换到版本 mysql-connector-java-5.1.49(2020 年发布)时,一切都像魅力一样。

您可以从 maven repo 获取驱动程序版本: https://mvnrepository.com/artifact/mysql/mysql-connector-java

将驱动程序复制到类路径,在我的情况下,如果下载 kafka 并复制到 kafka_2.12-2.3.1/libs/ 目录中

【讨论】:

  • 我在使用 MSK 连接时遇到了同样的错误,kafka-connect-jdbc:10.2.5 通过将 postgres 更新到最新版本 postgresql:42.3.1 来修复它。早些时候它使用来自 kafka-connect-jdbc 的 pom.xml 的postgresql:42.2.19,理想情况下它应该可以工作。不知道为什么我首先得到了错误。
【解决方案2】:

您收到此错误是因为 JDBCSink(和 JDBCSource)连接器使用 JDBC(顾名思义)连接到数据库,并且您没有使 MySQL 的 JDBC 驱动程序可用于连接器。

解决此问题的最佳方法是将 MySQL JDBC 驱动程序复制到与 kafka-connect-jdbc 相同的文件夹中(在 Docker 映像上为 /usr/share/java/kafka-connect-jdbc/)。

如果您使用的是 Docker Compose,那么您有三个选项。

  1. 构建安装了驱动程序的自定义 Docker 映像

  2. 在本地下载驱动

    # Download to host machine
    mkdir local-jdbc-drivers
    cd local-jdbc-drivers
    curl https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-8.0.18.tar.gz | tar xz 
    

    并将其挂载到容器中到Kafka Connect JDBC的路径中:

    volumes:
      - ${PWD}/local-jdbc-drivers:/usr/share/java/kafka-connect-jdbc/driver-jars/
    
  3. 像这样在运行时安装它:

    command: 
      - /bin/bash
      - -c 
      - |
        # JDBC Drivers
        # ------------
        # MySQL
        cd /usr/share/java/kafka-connect-jdbc/
        curl https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-8.0.18.tar.gz | tar xz 
        # Now launch Kafka Connect
        sleep infinity &
        /etc/confluent/docker/run 
    

更多详情请见this blog

【讨论】:

  • 感谢您的解决方案。会检查并回复您。
  • 我尝试了这一步,但仍然出现错误。我正在使用 docker 并将数据下沉到外部 MySQL 数据库。如果可能,请检查连接 URL?我在初始步骤中为io.debezium.connector.mysql.MySqlConnector 使用的相同URL 它正在工作。在连接io.confluent.connect.jdbc.JdbcSinkConnector的时候只报错。
  • 你是如何在 Docker 中运行它的?您可以编辑您的问题以显示 Docker Compose 的完整配置吗?
  • 我签入了加载的插件,所有的插件也都加载了。我有一个问题可能是错误会出现两件事,一是未加载插件,另一件事是 JDBC URL 指定不正确。我使用相同的主机名、用户名和密码,因为相同的只有数据库名称不同。无论如何要调试数据库连接。谢谢。
  • 这不是关于加载插件的问题,而是关于 MySQL JDBC 驱动程序 JAR 在 kafka-connect-jdbc 文件夹中
猜你喜欢
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2020-07-31
  • 2020-03-30
相关资源
最近更新 更多