微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用超集连接 clickhouse 数据库发生错误:无法加载数据库驱动程序:clickhouse

如何解决无法使用超集连接 clickhouse 数据库发生错误:无法加载数据库驱动程序:clickhouse

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

解决方法

要访问 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

为了测试,让我们使用在本地主机上运行的 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

enter image description here


案例 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

两个服务器都可以通过安全原生协议(不是 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。