You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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全局配置。

解决步骤:

  1. 检查index_parallel任务的JSON配置,找到数据源相关配置段,确认connectURI为PostgreSQL格式:jdbc:postgresql://postgres:5432/druid,替换错误的Derby URL
  2. 确保任务配置中driverClassName字段值为org.postgresql.Driver,与URL匹配
  3. 确认任务配置没有继承或引用任何默认的Derby数据源配置
  4. 重新构建Druid镜像并重启所有服务,确保驱动包加载生效(执行docker-compose down && docker-compose build && docker-compose up -d)

内容的提问来源于stack exchange,提问作者Devisahay Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 08:55:54