【问题标题】:can't connect clickhouse db using superset occur ERROR: Could not load database driver: clickhouse无法使用超集连接 clickhouse db 错误:无法加载数据库驱动程序:clickhouse
【发布时间】:2021-05-06 06:06:32
【问题描述】:

URI 字符串是: clickhouse://gpsec:xxx@xxx:8858/sec

docker-compose logs -f -t superset
superset_app             | 2021-02-02T03:23:36.323066230Z 172.17.0.233 - - [02/Feb/2021 03:23:36] "GET /api/v1/database/_info?q=(keys:!(permissions)) HTTP/1.1" 200 -
superset_app             | 2021-02-02T03:23:36.323076390Z INFO:werkzeug:172.17.0.233 - - [02/Feb/2021 03:23:36] "GET /api/v1/database/_info?q=(keys:!(permissions)) HTTP/1.1" 200 -
superset_app             | 2021-02-02T03:23:36.377123020Z 172.17.0.233 - - [02/Feb/2021 03:23:36] "GET /static/assets/images/favicon.png HTTP/1.1" 200 -
superset_app             | 2021-02-02T03:23:36.377136655Z INFO:werkzeug:172.17.0.233 - - [02/Feb/2021 03:23:36] "GET /static/assets/images/favicon.png HTTP/1.1" 200 -
superset_app             | 2021-02-02T03:23:48.713990050Z DEBUG:superset.models.core:Database.get_sqla_engine(). Masked URL: clickhouse://gpsec:XXXXXXXXXX@10.200.xx.xx:8858/sec
superset_app             | 2021-02-02T03:23:48.716697915Z DEBUG:superset.stats_logger:[stats_logger] (incr) DatabaseRestApi.test_connection.error
superset_app             | 2021-02-02T03:23:48.716723303Z DEBUG:superset.stats_logger:[stats_logger] (timing) DatabaseRestApi.test_connection.time | 7.412515580654144
superset_app             | 2021-02-02T03:23:48.717956405Z 172.17.0.233 - - [02/Feb/2021 03:23:48] "POST /api/v1/database/test_connection HTTP/1.1" 422 -
superset_app             | 2021-02-02T03:23:48.717973565Z INFO:werkzeug:172.17.0.233 - - [02/Feb/2021 03:23:48] "POST /api/v1/database/test_connection HTTP/1.1" 422 -

docker-compose.yml (https://github.com/apache/superset/blob/master/docker-compose.yml)

#
x-superset-image: &superset-image apache/superset:latest-dev
x-superset-depends-on: &superset-depends-on
  - db
  - redis
x-superset-volumes: &superset-volumes
  # /app/pythonpath_docker will be appended to the PYTHONPATH in the final container
  - ./docker:/app/docker
  - ./superset:/app/superset
  - ./superset-frontend:/app/superset-frontend
  - superset_home:/app/superset_home
  - ./tests:/app/tests

version: "3.7"
services:
  redis:
    image: redis:3.2
    container_name: superset_cache
    restart: unless-stopped
    ports:
      - "127.0.0.1:6379:6379"
    volumes:
      - redis:/data

  db:
    env_file: docker/.env
    image: postgres:10
    container_name: superset_db
    restart: unless-stopped
    ports:
      - "127.0.0.1:5432:5432"
    volumes:
      - db_home:/var/lib/postgresql/data

  superset:
    env_file: docker/.env
    image: *superset-image
    container_name: superset_app
    command: ["/app/docker/docker-bootstrap.sh", "app"]
    restart: unless-stopped
    ports:
      - 8088:8088
    user: "root"
    depends_on: *superset-depends-on
    volumes: *superset-volumes
    environment:
      CYPRESS_CONFIG: "${CYPRESS_CONFIG}"

  superset-init:
    image: *superset-image
    container_name: superset_init
    command: ["/app/docker/docker-init.sh"]
    env_file: docker/.env
    depends_on: *superset-depends-on
    user: "root"
    volumes: *superset-volumes
    environment:
      CYPRESS_CONFIG: "${CYPRESS_CONFIG}"

  superset-node:
    image: node:12
    container_name: superset_node
    command: ["/app/docker/docker-frontend.sh"]
    env_file: docker/.env
    depends_on: *superset-depends-on
    volumes: *superset-volumes

  superset-worker:
    image: *superset-image
    container_name: superset_worker
    command: ["/app/docker/docker-bootstrap.sh", "worker"]
    env_file: docker/.env
    restart: unless-stopped
    depends_on: *superset-depends-on
    user: "root"
    volumes: *superset-volumes

  superset-tests-worker:
    image: *superset-image
    container_name: superset_tests_worker
    command: ["/app/docker/docker-bootstrap.sh", "worker"]
    env_file: docker/.env
    environment:
      DATABASE_HOST: localhost
      DATABASE_DB: test
      REDIS_CELERY_DB: 2
      REDIS_RESULTS_DB: 3
      REDIS_HOST: localhost
    network_mode: host
    depends_on: *superset-depends-on
    user: "root"
    volumes: *superset-volumes

volumes:
  superset_home:
    external: false
  db_home:
    external: false
  redis:
    external: false

【问题讨论】:

  • 你能提供你的 docker-compose.yml 文件吗?

标签: clickhouse superset


【解决方案1】:

要访问 ClickHouse,应安装其驱动程序:

# make sure that 'docker-compose up' started

cd _folder_where_located_docker-compose.yaml_

# to access to CH through native protocol use package 'clickhouse-sqlalchemy' not 'sqlalchemy-clickhouse' (see description below)
# nevertheless I recommend always using 'clickhouse-sqlalchemy' (see https://stackoverflow.com/a/66067453/303298)
docker-compose exec superset pip install clickhouse-sqlalchemy
# docker-compose exec superset pip install sqlalchemy-clickhouse

docker-compose restart

案例1:连接本地ClickHouse

为了测试,让我们使用在 localhost 上运行的 ClickHouse:

  • 通过在 docker-compose.yaml 中的 superset-container 中添加选项 extra_hosts 使 localhost 在 docker-compose 中可见
  ..
  superset:
    ..
    extra_hosts:
      - "host.docker.internal:host-gateway" 

  ..   
  • 运行命令
docker-compose restart

# to access to CH through native protocol use package 'clickhouse-sqlalchemy' not 'sqlalchemy-clickhouse' (see description below)
# nevertheless I recommend always using 'clickhouse-sqlalchemy' (see https://stackoverflow.com/a/66067453/303298)
docker-compose exec superset pip install clickhouse-sqlalchemy
# docker-compose exec superset pip install sqlalchemy-clickhouse

docker-compose restart
  • 浏览 http://localhost:8088/databaseview/list 并添加带有 url 的 CH 数据库 clickhouse://host.docker.internal


案例 2:连接到外部 ClickHouse

有两个公共 ClickHouse:

  • 演示 Yandex CH
docker run -it --rm yandex/clickhouse-client:latest \
    --host gh-api.clickhouse.tech --user explorer -s
docker run -it --rm yandex/clickhouse-client:latest \
    --host github.demo.trial.altinity.cloud -s --user demo --password demo

两台服务器都可以通过secure native协议(不是HTTP)使用,所以需要安装clickhouse-sqlalchemy而不是sqlalchemy-clickhouse,因为第一个支持本地协议:

# uninstall 'sqlalchemy-clickhouse' if it used before
# docker-compose exec superset pip uninstall sqlalchemy-clickhouse

docker-compose exec superset pip install clickhouse-sqlalchemy
docker-compose restart

现在添加一个带有所需连接字符串的新数据库:

# Demo Yandex ClickHouse
clickhouse+native://explorer@gh-api.clickhouse.tech/default?secure=true

# Demo Altinity.Cloud CH
clickhouse+native://demo:demo@github.demo.trial.altinity.cloud/default?secure=true

另见https://stackoverflow.com/a/66067453/303298

【讨论】:

  • @Cian np - 我很乐意提供帮助。
  • 嘿@vladimir-你有没有让这个与外部clickhouse集群一起工作——在我的例子中是在altinity云上?
  • @redsquare 我扩展了答案,包括连接到 Demo Altinity.Cloud ClickHouse。
  • @vladimir 超集 ui 不喜欢连接字符串 btw 上的 clickhouse+native 前缀
  • @ANILPATEL 你不能这样做 - clickhouse-sqlalchemy 不支持这个功能。您可以在这里feature request 或使用CH load balancer 要求实现此功能。
猜你喜欢
  • 2018-03-25
  • 2021-04-29
  • 1970-01-01
  • 2019-07-24
  • 2020-01-04
  • 2019-06-22
  • 2012-09-17
  • 2020-07-12
  • 2019-03-10
相关资源
最近更新 更多