如何解决Docker部署的Superset无法连接Druid的问题?
问题:Superset无法连接Docker部署的Druid数据源
背景
我正在搭建一个由Kafka+Druid+Superset组成的项目,三个组件均通过Docker Compose单独部署,本地单独运行状态正常:Kafka已存入测试数据,Druid运行无异常,Superset能正常加载演示数据。
问题描述
尝试在Superset中添加Apache Druid数据源时,先后使用以下SQLALCHEMY URI:
druid://localhost:8082/druid/v2/sql/ druid+http://localhost:8082/druid/v2/sql/ druid+https://localhost:8082/druid/v2/sql/ druid+https://172.19.0.7:8082/druid/v2/sql/
均出现报错:
ERROR: (builtins.NoneType) None (Background on this error at: https://sqlalche.me/e/14/dbapi)
仅最后一个URI出现超时问题。
排查测试
为确认Druid本身无异常,我编写了Python测试脚本,使用pydruid连接Druid并执行查询,脚本可正常返回数据:
from pydruid.db import connect conn = connect(host='localhost', port=8082, path='/druid/v2/sql/', scheme='http') cursor = conn.cursor() print(cursor.url) query = "SELECT * FROM test LIMIT 10" cursor.execute(query) rows = cursor.fetchall() for row in rows: print(row) cursor.close() conn.close()
我的Superset Docker Compose配置如下:
version: '3.7' services: superset: image: apache/superset container_name: superset ports: - "8088:8088" environment: SUPERSET_LOAD_EXAMPLES: 'yes' # Load examples to explore Superset features SUPERSET_DB_URI: 'sqlite:////superset/superset.db' # Using SQLite for simplicity SUPERSET_SECRET_KEY: 'dsadsadsadsadasdas' volumes: - superset_home:/superset command: ["superset", "run", "-h", "0.0.0.0", "-p", "8088", "--with-threads", "--reload", "--debugger"] volumes: superset_home:
问题原因及解决方法
1. 容器网络互通问题
Superset运行在Docker容器内,使用localhost会指向容器自身而非宿主机。你的测试脚本在宿主机运行能访问Druid,但容器内的Superset无法通过localhost访问宿主机的Druid服务。
- 解决方法:
- 如果Druid也运行在Docker容器中,将两者加入同一个Docker网络,然后使用Druid容器名作为主机名,比如
druid+http://druid-container:8082/druid/v2/sql/(替换druid-container为你的Druid容器实际名称)。 - 如果Druid运行在宿主机,Linux/macOS下可使用宿主机Docker内部IP(通常为
172.17.0.1),Windows下使用host.docker.internal,URI格式为druid+http://172.17.0.1:8082/druid/v2/sql/。
- 如果Druid也运行在Docker容器中,将两者加入同一个Docker网络,然后使用Druid容器名作为主机名,比如
2. SQLAlchemy URI格式错误
Superset连接Druid的正确URI格式应为druid+http://<host>:<port>/druid/v2/sql/,注意不要额外添加后缀斜杠,同时要确保协议(http/https)与Druid实际配置一致。你的Druid使用http协议,不要用druid+https://格式,避免协议不匹配导致连接失败。
3. Superset依赖缺失
虽然官方镜像通常包含pydruid,但如果镜像版本较旧或依赖损坏,也会导致连接失败。可进入Superset容器升级依赖:
docker exec -it superset pip install --upgrade pydruid
安装完成后重启Superset容器。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

