인프런 커뮤니티 질문&답변

이현진님의 프로필 이미지

작성한 질문수

Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

Kafka Source Connect 사용

아래와 같이 실습 도중, No suitable driver found 에러가 나서 질문드립니다.

작성

·

113

0

아래와 같이 실습 도중, No suitable driver found 에러가 나서 질문드립니다.

  1. docker-compose.yml을 통해 zookeeper, kafka broker, kafka connect, mariadb 컨테이너를 실행시켰습니다.

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.2.1
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: confluentinc/cp-server:7.2.1
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
      - "9101:9101"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_JMX_PORT: 9101
      KAFKA_JMX_HOSTNAME: localhost
      KAFKA_CONFLUENT_SCHEMA_REGISTRY_URL: http://schema-registry:8081
      CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: broker:29092
      CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1
      CONFLUENT_METRICS_ENABLE: 'true'
      CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous'

  connect:
    image: cnfldemos/cp-server-connect-datagen:0.5.3-7.1.0
    hostname: connect
    container_name: connect
    depends_on:
      - broker
      - mariadb
    ports:
      - "8083:8083"
    volumes:
      - ./kafka-connect-jdbc:/etc/kafka-connect/jars # JDBC 드라이버가 설치된 경로를 마운트
    environment:
      CONNECT_BOOTSTRAP_SERVERS: 'broker:29092'
      CONNECT_REST_ADVERTISED_HOST_NAME: connect
      CONNECT_GROUP_ID: compose-connect-group
      CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs
      CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_OFFSET_FLUSH_INTERVAL_MS: 10000
      CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets
      CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status
      CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
      CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter
      CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081
      CLASSPATH: /usr/share/java/monitoring-interceptors/monitoring-interceptors-7.2.1.jar
      CONNECT_PRODUCER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor"
      CONNECT_CONSUMER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringConsumerInterceptor"
      CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components,/etc/kafka-connect/jars"
      CONNECT_LOG4J_LOGGERS: org.apache.zookeeper=ERROR,org.I0Itec.zkclient=ERROR,org.reflections=ERROR

  mariadb:
    image: mariadb:10.5
    container_name: mariadb
    hostname: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: testdb
      MYSQL_USER: testuser
      MYSQL_PASSWORD: testpassword
    ports:
      - "3306:3306"
    volumes:
      - ./mariadb_data:/var/lib/mysql
  1. 확인 결과, kafka connect 컨테이너 내부의 /etc/kafka-connect/jars 경로 아래에 kafka-connect-jdbc-10.6.3.jar,  mariadb-java-client-2.7.2.jar 가 잘 위치해있습니다.

  2. mariadb 컨테이너 내부로 접속하여 users 데이터베이스를 잘 생성하였고, 테스트 데이터도 잘 삽입해주었고 결과까지 확인했습니다.

  3. postman으로 아래와 같이 source 생성 요청 결과 201 응답이 정상적으로 잘 도착하였습니다.

    [POST] 127.0.0.1:8083/connectors
    
    {
        "name": "my-source-connector3",
        "config": {
            "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
            "connection.url": "jdbc:mysql://mariadb:3306/testdb",
            "connection.user": "testuser",
            "connection.password": "testpassword",
            "mode": "incrementing",
            "incrementing.column.name": "id",
            "table.whitelist": "users",
            "topic.prefix": "my_topic_",
            "tasks.max": "1"
        }
    }

    5. 그러나 127.0.0.1:8083/connectors/my-source-connector/status 으로 요청을 보내면 아래와 같은 오류가 발생합니다.

    {
        "name": "my-source-connector",
        "connector": {
            "state": "FAILED",
            "worker_id": "connect:8083",
            "trace": "org.apache.kafka.connect.errors.ConnectException: java.sql.SQLException: No suitable driver found for jdbc:mysql://mariadb:3306/testdb\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:59)\n\tat io.confluent.connect.jdbc.JdbcSourceConnector.start(JdbcSourceConnector.java:94)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doStart(WorkerConnector.java:185)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.start(WorkerConnector.java:210)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:349)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doTransitionTo(WorkerConnector.java:332)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.doRun(WorkerConnector.java:141)\n\tat org.apache.kafka.connect.runtime.WorkerConnector.run(WorkerConnector.java:118)\n\tat java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\tat java.base/java.lang.Thread.run(Thread.java:829)\nCaused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://mariadb:3306/testdb\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:702)\n\tat java.sql/java.sql.DriverManager.getConnection(DriverManager.java:189)\n\tat io.confluent.connect.jdbc.dialect.GenericDatabaseDialect.getConnection(GenericDatabaseDialect.java:250)\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.newConnection(CachedConnectionProvider.java:80)\n\tat io.confluent.connect.jdbc.util.CachedConnectionProvider.getConnection(CachedConnectionProvider.java:52)\n\t... 12 more\n"
        },
        "tasks": [],
        "type": "source"
    }

답변 3

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

Kafka-connect의 DB 연동에 대한 문제인 것 같습니다. Source connect 자체를 등록하는데에는 DB 연결을 직접 하는게 아니다 보니, Connector 자체의 등록만 처리되었거, 실제 작업 부분에서 커넥트의 상태를 확인해 봤을 때, DB 연결이 안되었다고 오류가(No suitable driver found) 발생한 부분은 DB 접속을 위한 JDBC 드라이버 인식이 안되었다는 오류인것 같습니다. 말씀하신 docker-compose.yml 파일 형태로 다시한번 구동해 보고, 추가 답변드리도록 하겠습니다.

감사합니다.

0

저도 동일하게 docker-compose.yml 파일로 컨테이너들 띄웠는데 동일한 에러가 발생하네요... mariadb든 mysql이든 지지고 볶든말든 jdbc:mariadb://mariadb:3306으로 접속을 못하고 있습니다...

0

안녕하세요, 인프런 AI 인턴입니다. 이현진님의 질문을 면밀히 살펴보았습니다. “No suitable driver found for jdbc:mysql://mariadb:3306/testdb” 오류는 보통 JDBC 드라이버가 적절히 위치하지 않았거나, 연결 URL이 잘못 지정되었을 때 발생합니다.

해당 문제를 해결하는 핵심 포인트는 다음과 같습니다:
- MariaDB를 사용하는 경우, 연결 URL에 사용되는 프로토콜은 jdbc:mariadb://여야 합니다. 그러나 오류 메시지를 보면, jdbc:mysql://로 지정되어 있습니다. 이 부분을 jdbc:mariadb://로 수정해야 할 수 있습니다.
- Kafka Connect 컨테이너 내부에 올바른 JDBC 드라이버(mariadb-java-client-버전.jar)가 존재하고, 이 드라이버가 Kafka Connect의 CLASSPATH에 포함되어 있는지 확인해야 합니다.

이와 관련하여 유사한 문제를 경험하고 해결한 다른 학습자의 질문 및 강사님의 답변이 유익할 것 같습니다. 아래 링크의 내용을 참조하시는 것을 권장드립니다:

  • source-connect 등록 시 에러 질문이요
    • 이 질문에서는 Docker 환경에서 MariaDB를 실행하고 Kafka Connect와 연동하는 과정에서 발생한 문제와 그에 대한 해답이 제시되었습니다. 특히, Kafka Connect 설정에서 사용하는 MariaDB의 JDBC 연결 URL이 올바르게 지정되지 않아 발생하는 문제에 대해 설명하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이현진님의 프로필 이미지
이현진
질문자

MariaDB를 사용하는 경우, 연결 URL에 사용되는 프로토콜은 jdbc:mariadb://여야 합니다. 그러나 오류 메시지를 보면, jdbc:mysql://로 지정되어 있습니다. 이 부분을 jdbc:mariadb://로 수정해야 할 수 있습니다.

=> 위 답변대로 수정해주어도 동일한 오류가 계속 납니다


- Kafka Connect 컨테이너 내부에 올바른 JDBC 드라이버(mariadb-java-client-버전.jar)가 존재하고, 이 드라이버가 Kafka Connect의 CLASSPATH에 포함되어 있는지 확인해야 합니다.

=> 저는 connect 컨테이너의 환경변수로 CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components,/etc/kafka-connect/jars"를 추가해주었고, 여기서 외부의 jdbc*.jar 파일 2개가 위치한 경로를 내부에 마운트 해준 경로가 바로 /etc/kafka-connect/jars입니다. 위 질문내용에도 있듯이, 해당 경로 내부에 jdbc*.jar 파일들이 모두 잘 위치하고 있음을 connect 컨테이너 내부에 접속하여 확인완료하였습니다.
=> 환경변수는 내부의 컨테이너에 접속하여 아래와 같이 잘 설정되었음을 확인완료하였습니다.

[appuser@connect ~]$ echo $CONNECT_PLUGIN_PATH
/usr/share/java,/usr/share/confluent-hub-components,/etc/kafka-connect/jars