24.08.19 00:43 작성
·
72
0
아래와 같이 실습 도중, No suitable driver found 에러가 나서 질문드립니다.
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
확인 결과, kafka connect 컨테이너 내부의 /etc/kafka-connect/jars
경로 아래에 kafka-connect-jdbc-10.6.3.jar, mariadb-java-client-2.7.2.jar 가 잘 위치해있습니다.
mariadb 컨테이너 내부로 접속하여 users 데이터베이스를 잘 생성하였고, 테스트 데이터도 잘 삽입해주었고 결과까지 확인했습니다.
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
2024. 09. 01. 23:16
안녕하세요, 이도원입니다.
Kafka-connect의 DB 연동에 대한 문제인 것 같습니다. Source connect 자체를 등록하는데에는 DB 연결을 직접 하는게 아니다 보니, Connector 자체의 등록만 처리되었거, 실제 작업 부분에서 커넥트의 상태를 확인해 봤을 때, DB 연결이 안되었다고 오류가(No suitable driver found) 발생한 부분은 DB 접속을 위한 JDBC 드라이버 인식이 안되었다는 오류인것 같습니다. 말씀하신 docker-compose.yml 파일 형태로 다시한번 구동해 보고, 추가 답변드리도록 하겠습니다.
감사합니다.
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에 포함되어 있는지 확인해야 합니다.
이와 관련하여 유사한 문제를 경험하고 해결한 다른 학습자의 질문 및 강사님의 답변이 유익할 것 같습니다. 아래 링크의 내용을 참조하시는 것을 권장드립니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
2024. 08. 19. 01:04
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 컨테이너 내부에 접속하여 확인완료하였습니다.=> 환경변수는 내부의 컨테이너에 접속하여 아래와 같이 잘 설정되었음을 확인완료하였습니다.