하는 일/데이터엔지니어링

[ 프로젝트 세팅 ] Superset + ClickHouse (Windows)

yeznable 2025. 5. 29. 16:59
728x90

윈도우 환경에서 Superset에 ClickHouse를 연결한 실습 내용을 나중에 찾아보기 좋게 남겨둔다.

ClickHouse 세팅은 이전에 했던 실습 내용을 가지고 진행했다.

 

[ 맛보기 ] ClickHouse - OLAP 특화 데이터베이스

최근의 프로젝트 트렌드와 과정을 보여주는 다음 링크에서 ClickHouse라는 데이터베이스에 대해 알게 되었다. Open Source Database - Popularity Trends | OSS InsightThe following dynamic charts show the popularity trends of

yeznable-blog.tistory.com

위의 실습 결과에서 docker-compose.yml 파일을 네트워크 설정을 위해 나중에 수정해줘야 한다.

 

Superset에서 사용할 데이터가 ClickHouse에 있는데 이건 또한 ClickHouse + dbt 실습에서 만들었던 지표를 활용한다.

 

[ 프로젝트 세팅 ] ClickHouse + dbt (Windows, uv)

ClickHouse + dbt 프로젝트 세팅 방법을 남겨둔다.이 세팅은 다음 링크의 내용을 따라 ClickHouse가 Windows 운영환경의 WSL에서 실행되고 있다는 것을 전제로 이어서 진행된다. [ 맛보기 ] ClickHouse - OLAP 특

yeznable-blog.tistory.com


ClickHouse 준비

우선 이전의 클릭하우스 실습 결과를 수퍼셋과 함께 활용하기 위해 어떤 부분을 수정해야 하는지 정리한다.

실습을 따랐다면 WSL의 ~/clickhouse/ 경로에 다음과 같은 두개의 파일이 작성되어 있을 것이다.

# wsl에 접속이 된 상태
# 파일구조 확인
ls ~/clickhouse/
# 출력 결과
# admin.xml  docker-compose.yml

 

admin.xml 파일은(~/clickhouse/admin.xml) 클릭하우스 데이터베이스에 외부로부터 접속할 수 있는 유저를 미리 생성해줄 수 있게 다음과 같이 작성되었고 실습 내용 그대로 사용하면 된다.

이렇게 하면 다음과 같은 정보로 클릭하우스에 접속할 수 있다.

ID: admin
PASSWORD: supersecret

SCHEMA: default

<clickhouse>
  <users>
    <admin>
      <password>supersecret</password>
      <networks>
        <ip>::/0</ip>
      </networks>
      <profile>default</profile>
      <quota>default</quota>
    </admin>
  </users>
</clickhouse>

 

docker-compose.yml 파일은(~/clickhouse/docker-compse.yml) 이전 실습 결과 파일에서 네트워크 관련 내용을 추가해서 저장한다.

version: '3.8'

services:
  clickhouse:
    image: clickhouse/clickhouse-server:latest
    container_name: clickhouse
    ports:
      - "8123:8123"
      - "9000:9000"
    volumes:
      - clickhouse_data:/var/lib/clickhouse
      - ./admin.xml:/etc/clickhouse-server/users.d/admin.xml
      - /mnt/d/clickhouse:/var/lib/clickhouse/user_files
    ulimits:
      nofile:
        soft: 262144
        hard: 262144
    networks:                        # 네트워크 관련 추가된 라인
      - analytics_net                # 네트워크 관련 추가된 라인
    restart: unless-stopped

volumes:
  clickhouse_data:

networks:                            # 네트워크 관련 추가된 라인
  analytics_net:                     # 네트워크 관련 추가된 라인
    external: true                   # 네트워크 관련 추가된 라인

 

이렇게 docker-compose.yml을 작성하고 컨테이너가 실행 중이라면 종료한다.

# 컨테이너가 실행중인지 확인
docker ps

# 실행중이라면 중지
cd ~/clickhouse
docker compose down

Superset 준비

이제 Superset 설정을 준비한다.

내가 구성할 Superset의 구조는 Superset + PostgreSQL + Redis 조합이다.

클릭하우스와 동일한 docker-compos.yml에서 정의한다면 네트워크 설정 등이 더 쉬울 수 있으나 나는 docker compose up 또는 down을 사용할 때 수퍼셋과 클릭하우스를 한꺼번에 실행하거나 종료하기보다 구분해서 관리하고자 해서 수퍼셋을 위한 디렉토리를 따로 만들고 필요한 설정 파일들을 작성한다.

 

해당 위치에 작성될 파일들을 다음과 같다.

  • Dockerfile
  • docker-init.sh
  • superset_config.py
  • docker-compose.yml

Dockerfile은 다음과 같이 작성한다. (~/superset/Dockerfile)

수퍼셋은 기본으로 SQLite를 내부 메타데이터 저장소로 사용하도록 설정되어있다. 그래서 PostgreSQL을 내부 메타데이터 저장소로 사용하도록 하기 위해서 psycopg2-binary를 pip으로 설치한다.

또한 수퍼셋에 클릭하우스를 연결할 수 있도록 하는 기능은 기본으로 제공되지 않아서 clickhouse-connect를 설치한다.

해당 내용이 아래 Dockerfile을 작성해둠으로 적용된다.

FROM apache/superset:latest

USER root
RUN pip install --no-cache-dir psycopg2-binary clickhouse-connect
USER superset


docker-init.sh는 다음과 같이 작성한다.(~/superset/docker-init.sh)

초기 계정 생성을 컨테이너 실행과 동시에 수행해주는 역할을 한다.

#!/bin/bash
set -e

echo "▶ DB URI: $SUPERSET_DATABASE_URI"

superset db upgrade

superset fab create-admin \
    --username "$ADMIN_USERNAME" \
    --firstname "$ADMIN_FIRSTNAME" \
    --lastname "$ADMIN_LASTNAME" \
    --email "$ADMIN_EMAIL" \
    --password "$ADMIN_PASSWORD" || true

superset init

gunicorn --bind 0.0.0.0:8088 "superset.app:create_app()"

 

 

superset_config.py 다음과 같이 작성한다. (~/superset/superset_config.py )

PostgreSQL을 내부 메타데이터 저장소로 사용하기 위해 필요한 설정이다.

SQLALCHEMY_DATABASE_URI = "postgresql+psycopg2://superset:superset@db:5432/superset"

 

docker-compose.yml을 다음과 같이 작성한다.(~/superset/docker-compose.yml)

superset, postgres, redis 컨테이너에 대한 설정이 작성되어 있다.

위에 작성한 docker-init.sh, superset_config.py 등을 활용한 설정이 적용되어있고 클릭하우스에 접속할 수 있게 동일한 네트워크 analytics_net를 사용하도록 설정되어있다.

version: "3.8"

services:
  superset:
    build: .
    container_name: superset
    ports:
      - "8088:8088"
    environment:
      - SUPERSET_SECRET_KEY=supersecretkey
      - ADMIN_USERNAME=admin
      - ADMIN_PASSWORD=admin
      - ADMIN_FIRSTNAME=Superset
      - ADMIN_LASTNAME=Admin
      - ADMIN_EMAIL=admin@example.com
    volumes:
      - ./superset_home:/app/superset_home
      - ./docker-init.sh:/app/docker-init.sh
      - ./superset_config.py:/app/pythonpath/superset_config.py
    depends_on:
      - db
      - redis
    restart: always
    command: ["bash", "/app/docker-init.sh"]
    networks:
      - analytics_net

  db:
    image: postgres:13
    container_name: superset_db
    environment:
      POSTGRES_DB: superset
      POSTGRES_USER: superset
      POSTGRES_PASSWORD: superset
    volumes:
      - superset_db_data:/var/lib/postgresql/data
    networks:
      - analytics_net

  redis:
    image: redis:7
    container_name: superset_redis
    networks:
      - analytics_net

volumes:
  superset_db_data:

networks:
  analytics_net:
    external: true

실행

다음 과정을 통해 필요한 서비스들을 모두 실행한다.

# 네트워크 확인
docker network ls

# NAME이 analytics_net인 네트워크가 없다면 생성
docker network create analytics_net

# 클릭하우스 실행
cd ~/clickhouse
docker compose up -d

# 수퍼셋 실행
cd ~/superset
docker compose up --build -d

 

수퍼셋이 완전히 실행될 때 까지는 시간이 조금 걸린다.

다음 명령어로 로그를 보며 진행도를 확인할 수 있다.

# 로그 확인
docker logs -f superset

 

로그가 더이상 작성되지 않는 것 같다면 localhost:8088로 접속 해본다.

잘 접속된다면 로그 확인은 CTRL+C로 벗어난다.

로그인 정보는 미리 설정해뒀던 것처럼 ID: admin / PWD: admin 이다.

 

클릭하우스를 연결하기 전에 수퍼셋 컨테이너에서 클릭하우스에 연결이 잘 되는지 확인하고싶다면 다음 명령어로 확인할 수 있다.

Ok. 와 같이 출력된다면 연결이 잘 되는 것이다.

# 클릭하우스 연결 확인
docker exec -it superset curl http://clickhouse:8123

 

수퍼셋에 접속(localhost:8088)해서 우측 상단의 +버튼 > Data > Connect database 버튼을 누르면 데이터베이스 연결 화면이 나온다.

 

이어서 연결할 데이터베이스로 클릭하우스를 선택하고 계정 정보를 입력하고 Finish 버튼을 눌러주면 연결이 완료된다.

 

이제 상단 메뉴의 Datasets 또는 SQL 탭에서 클릭하우스의 데이터를 다룰 수 있다.


SQL Lab 화면에 들어가서 확인해보니 지난 실습에서 dbt로 만들었던 ClickHouse > default_gold > retention 테이블을 확인할 수 있었다.

 

데이터셋을 지정하거나 쿼리를 저장해서 굉장히 다양한 차트들을 만들 수 있었다.


프로젝트 세팅 정도는 여기까지 하고 실제 Supset을 활용하는 건 나중에 남길 필요가 있으면 새 글로 남겨놔야겠다.

728x90