Druid Docker部署触发index_parallel任务时JDBC驱动错误排查
问题:Druid Index Parallel任务触发失败,报No suitable driver错误
触发index_parallel查询任务时失败,报错java.sql.SQLException: No suitable driver,错误详情显示无法为连接URL jdbc:derby://postgres:5432/druid;create=true创建org.postgresql.Driver类的JDBC驱动。已尝试将postgresql-42.7.7.jar添加到/opt/druid/extensions/postgresql-metadata-storage/路径,并更新Docker Compose配置与Dockerfile,但问题仍未解决。
错误详情
at org.apache.druid.indexing.common.task.IndexTask.determineShardSpecs(IndexTask.java:629) ~[druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.common.task.IndexTask.runTask(IndexTask.java:475) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.common.task.AbstractTask.run(AbstractTask.java:179) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.common.task.batch.parallel.ParallelIndexSupervisorTask.runSequential(ParallelIndexSupervisorTask.java:1234) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.common.task.batch.parallel.ParallelIndexSupervisorTask.runTask(ParallelIndexSupervisorTask.java:571) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.common.task.AbstractTask.run(AbstractTask.java:179) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.overlord.SingleTaskBackgroundRunner$SingleTaskBackgroundRunnerCallable.call(SingleTaskBackgroundRunner.java:478) [druid-indexing-service-34.0.0.jar:34.0.0] at org.apache.druid.indexing.overlord.SingleTaskBackgroundRunner$SingleTaskBackgroundRunnerCallable.call(SingleTaskBackgroundRunner.java:450) [druid-indexing-service-34.0.0.jar:34.0.0] at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:131) [guava-32.1.3-jre.jar:?] at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:76) [guava-32.1.3-jre.jar:?] at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:82) [guava-32.1.3-jre.jar:?] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?] at java.base/java.lang.Thread.run(Thread.java:840) [?:?] Caused by: java.io.IOException: java.lang.RuntimeException: org.skife.jdbi.v2.exceptions.UnableToObtainConnectionException: java.sql.SQLException: Cannot create JDBC driver of class 'org.postgresql.Driver' for connect URL 'jdbc:derby://postgres:5432/druid;create=true' at org.apache.druid.metadata.input.SqlEntity.openCleanableFile(SqlEntity.java:188) ~[druid-server-34.0.0.jar:34.0.0] at org.apache.druid.metadata.input.SqlEntity.fetch(SqlEntity.java:96) ~[druid-server-34.0.0.jar:34.0.0] at org.apache.druid.data.input.BytesCountingInputEntity.fetch(BytesCountingInputEntity.java:68) ~[druid-processing-34.0.0.jar:34.0.0] at org.apache.druid.metadata.input.SqlReader.intermediateRowIterator(SqlReader.java:70) ~[druid-server-34.0.0.jar:34.0.0] at org.apache.druid.data.input.IntermediateRowParsingReader.intermediateRowIteratorWithMetadata(IntermediateRowParsingReader.java:235) ~[druid-processing-34.0.0.jar:34.0.0] at org.apache.druid.data.input.IntermediateRowParsingReader.read(IntermediateRowParsingReader.java:49) ~[druid-processing-34.0.0.jar:34.0.0] at org.apache.druid.data.input.impl.InputEntityIteratingReader.lambda$read$0(InputEntityIteratingReader.java:76) ~[druid-processing-34.0.0.jar:34.0.0] ... 20 more
当前配置文件
Docker Compose配置
volumes: metadata_data: {} middle_var: {} historical_var: {} broker_var: {} coordinator_var: {} router_var: {} druid_shared: {} services: postgres: container_name: postgres image: postgres:latest ports: - "5432:5432" volumes: - metadata_data:/var/lib/postgresql/data environment: - POSTGRES_PASSWORD=FoolishPassword - POSTGRES_USER=druid - POSTGRES_DB=druid - POSTGRES_HOST_AUTH_METHOD=trust # Need 3.5 or later for container nodes zookeeper: container_name: zookeeper image: zookeeper:3.5.10 ports: - "2181:2181" environment: - ZOO_MY_ID=1 coordinator: # image: apache/druid:34.0.0 build: . container_name: coordinator volumes: - druid_shared:/opt/shared - coordinator_var:/opt/druid/var depends_on: - zookeeper - postgres ports: - "8081:8081" command: - coordinator env_file: - environment environment: - druid.metadata.storage.host=postgres - druid.metadata.storage.type=postgresql - druid.metadata.storage.connector.connectURI=jdbc:postgresql://postgres:5432/druid - druid.metadata.storage.connector.user=druid - druid.metadata.storage.connector.password=FoolishPassword broker: build: . container_name: broker volumes: - broker_var:/opt/druid/var depends_on: - zookeeper - postgres - coordinator ports: - "8082:8082" command: - broker env_file: - environment environment: - druid.metadata.storage.host=postgres - druid.metadata.storage.type=postgresql - druid.metadata.storage.connector.connectURI=jdbc:postgresql://postgres:5432/druid - druid.metadata.storage.connector.user=druid - druid.metadata.storage.connector.password=FoolishPassword historical: build: . container_name: historical volumes: - druid_shared:/opt/shared - historical_var:/opt/druid/var depends_on: - zookeeper - postgres - coordinator ports: - "8083:8083" command: - historical env_file: - environment environment: - druid.metadata.storage.host=postgres - druid.metadata.storage.type=postgresql - druid.metadata.storage.connector.connectURI=jdbc:postgresql://postgres:5432/druid - druid.metadata.storage.connector.user=druid - druid.metadata.storage.connector.password=FoolishPassword middlemanager: build: . container_name: middlemanager volumes: - druid_shared:/opt/shared - middle_var:/opt/druid/var depends_on: - zookeeper - postgres - coordinator ports: - "8091:8091" - "8100-8105:8100-8105" command: - middleManager env_file: - environment environment: - druid.metadata.storage.host=postgres - druid.metadata.storage.type=postgresql - druid.metadata.storage.connector.connectURI=jdbc:postgresql://postgres:5432/druid - druid.metadata.storage.connector.user=druid - druid.metadata.storage.connector.password=FoolishPassword router: build: . container_name: router volumes: - router_var:/opt/druid/var - ./data:/data depends_on: - zookeeper - postgres - coordinator ports: - "8888:8888" command: - router env_file: - environment environment: - druid.metadata.storage.host=postgres - druid.metadata.storage.type=postgresql - druid.metadata.storage.connector.connectURI=jdbc:postgresql://postgres:5432/druid - druid.metadata.storage.connector.user=druid - druid.metadata.storage.connector.password=FoolishPassword
Dockerfile
# Use the official Druid image as the base FROM apache/druid:34.0.0 # Copy the PostgreSQL JDBC driver to both extensions and lib directories COPY postgresql-42.7.7.jar /opt/druid/extensions/postgresql-metadata-storage/ COPY postgresql-42.7.7.jar /opt/druid/lib/ # Set ownership USER root RUN chown druid:druid /opt/druid/extensions/postgresql-metadata-storage/postgresql-42.7.7.jar && \ chown druid:druid /opt/druid/lib/postgresql-42.7.7.jar USER druid
解决方案
错误核心矛盾:任务使用了Derby格式的JDBC URL (jdbc:derby://postgres:5432/druid;create=true),但指定了PostgreSQL的驱动类org.postgresql.Driver,两者不匹配。你的Druid元数据存储配置已经正确指向PostgreSQL,问题出在index_parallel任务自身的数据源配置,而非Druid全局配置。
解决步骤:
- 检查index_parallel任务的JSON配置,找到数据源相关配置段,确认
connectURI为PostgreSQL格式:jdbc:postgresql://postgres:5432/druid,替换错误的Derby URL - 确保任务配置中
driverClassName字段值为org.postgresql.Driver,与URL匹配 - 确认任务配置没有继承或引用任何默认的Derby数据源配置
- 重新构建Druid镜像并重启所有服务,确保驱动包加载生效(执行
docker-compose down && docker-compose build && docker-compose up -d)
内容的提问来源于stack exchange,提问作者Devisahay Mishra
相关产品推荐
相关产品推荐

