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

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

yeznable 2025. 5. 27. 17:56
728x90

최근의 프로젝트 트렌드와 과정을 보여주는 다음 링크에서 ClickHouse라는 데이터베이스에 대해 알게 되었다.

 

Open Source Database - Popularity Trends | OSS Insight

The following dynamic charts show the popularity trends of GitHub repositories in this collection. You can display the popularity of repositories based on the number of stars, pull requests, pull request creators, and issues.

ossinsight.io

 

2025년 5월 기준으로 깃헙에서 elastricsearch 다음으로 많은 Stars를 받은 프로젝트라고 한다.

 

ChatGPT에게 자세히 물어봤다.


🧠 ClickHouse란?

ClickHouse는 **Yandex(얀덱스)**가 개발한 초고속 컬럼지향 OLAP 데이터베이스입니다.
대용량 데이터의 분석 쿼리에 최적화된 시스템으로, 실시간 집계와 복잡한 분석 쿼리를 매우 빠르게 처리할 수 있습니다.


📌 핵심 특징

항목 설명
💾 컬럼 지향 저장 데이터를 컬럼 단위로 저장하여 압축률이 높고, 필요한 컬럼만 읽어 효율적인 쿼리 수행
🚀 OLAP 최적화 수십억 건 이상의 데이터도 수 밀리초~수 초 이내로 집계 가능
🧱 MergeTree 엔진 파티셔닝, 인덱싱, TTL 등 지원하는 기본 스토리지 엔진
🔄 실시간 데이터 삽입/분석 Kafka, S3, 파일 등에서 실시간 데이터 수집 가능
📈 대시보드 연동 용이 Grafana, Superset, Metabase, DBeaver 등과 연동 가능
🧩 분산 처리 지원 여러 노드로 확장하여 분산 쿼리 처리 가능 (단, 설정 복잡도 있음)
💻 SQL 지원 MySQL 유사 문법 + 강력한 윈도우 함수, 집계 함수 지원

🔧 주요 사용 사례

  • 웹/앱 로그 분석
  • 사용자 행동 분석
  • 비즈니스 인텔리전스 (BI)
  • IoT 데이터 수집/분석
  • 마케팅 캠페인 실적 분석

📉 단점

항목 설명
❌ 트랜잭션 미지원 RDBMS와 달리 BEGIN / COMMIT이 없음 (OLAP에 특화)
❌ 자주 변경되는 데이터에 부적합 INSERT는 빠르지만 UPDATE/DELETE는 느림
❌ 스키마 유연성 낮음 JSON/NoSQL처럼 자유로운 스키마 구조는 아님
❌ 분산 환경 설정 복잡 싱글 노드는 쉬우나 분산 구성은 고난이도

💬 한 줄 요약

ClickHouse는 빠른 속도와 고압축 효율을 자랑하는 컬럼지향 OLAP DB로, 실시간 로그 및 BI 분석에 매우 적합한 도구입니다.


 

 

나는 " 수십억 건 이상의 데이터도 수 밀리초~수 초 이내로 집계 가능"이라는 부분에 관심이 생겼다.

비슷하게 OLAP 특화 데이터베이스인 DuckDB와 어떤 차이가 있는지 궁금해져서 또 물어봤다.

 


🆚 DuckDB vs ClickHouse

항목 🔹DuckDB 🔸ClickHouse
지향점 싱글 머신 내장형 분석 DB 분산형 초고속 분석 DB
설치 Python/R/C API, CLI, 라이브러리 등 다양한 내장형 독립 서버 (Docker/Cluster), 운영 인프라 필요
저장 방식 컬럼지향 + 파케/CSV/JSON 직접 쿼리 가능 컬럼지향 엔진 (MergeTree 등) 기반
트랜잭션 ACID 보장됨 (단일 세션 기준) 트랜잭션 미지원 (INSERT 중심 설계)
쓰기 작업 파일 기반으로 자유로움 (Parquet 저장/갱신 가능) 변경(UPDATE/DELETE)에 매우 취약함
읽기 성능 소규모 중간 볼륨에 최적화 대규모 데이터 처리에 매우 우수
분산 지원 ❌ 싱글 노드 전용 ✅ 분산 클러스터 구성 가능
메모리 사용량 매우 가볍고 빠름 고성능이지만 메모리/디스크 사용량 큼
유연성 파케/CSV 직접 쿼리, 파일단위 처리에 유리 완전한 테이블 기반 운영 필요
BI 도구 연동 Superset, Metabase, DBeaver 일부 제한적 지원 Superset, Grafana, Metabase 완전 지원
배포 방식 임베디드, 무설치도 가능 (파이썬 패키지 등) 서버/컨테이너/클러스터 필수
 

🧠 정리: 언제 어떤 걸 쓰면 좋을까?

✅ DuckDB를 선택할 때

  • Jupyter, Python 등에서 빠르게 파일 단위 분석할 때
  • 작은/중간 규모의 데이터로 임시 분석, 모델링, 테스트할 때
  • 로컬에서 CSV/Parquet/JSON 등을 직접 쿼리하고 싶을 때
  • 개발자/데이터 과학자 중심의 로컬 분석 작업일 때

✅ ClickHouse를 선택할 때

  • 수십억 건의 로그/이벤트 데이터를 실시간 분석해야 할 때
  • 다수의 유저에게 제공하는 BI 서비스 백엔드로 쓸 때
  • Grafana/Superset 등과 대시보드 통합하려 할 때
  • 대량의 데이터가 지속적으로 유입되고, 빠른 응답이 필수일 때

🎯 예시 시나리오

목적 추천
개인 노트북에서 로그 파싱 후 분석 DuckDB
대규모 웹 서비스 로그 집계 ClickHouse
Streamlit + PyGWalker 시각화 DuckDB
실시간 BI 대시보드 백엔드 ClickHouse
CSV/Parquet 탐색 DuckDB
Kafka → 대시보드 파이프라인 ClickHouse

 

이런 클릭하우스를 간단하게 시작까지만 해볼 수 있는 실습의 경험을 남겨둔다.


 

실행

환경은 윈도우 운영체제에서 WSL2와 Docker로 구성한다.

WSL이 활성화 또는 설치되어있고 Docker 엔진이 설치 및 실행되고 있는 환경이 필요하다.

 

WSL에 접속한다.

# wsl 설치 확인
wsl -l -v
# 출력 결과
#   NAME                   STATE           VERSION
# * Ubuntu-20.04           Running         2

# wsl 실행
wsl -d Ubuntu-20.04

# ClickHouse를 위한 디렉토리 생성 및 이동
mkdir ~/clickhouse
cd ~/clickhouse

 

만들어둔 디렉토리에 다음과 같이 2개의 파일을 작성한다.

아래 작성된 docker-compose.yml은 내가 도커로 클릭하우스를 띄우면서 만난 불편함을 고쳐서 적용한 것이다.

 

1. 외부 접속 계정 설정

admin.xml을 만들어서 설정 해둔 것은 ClickHouse를 wsl 안에서 커맨드라인으로만 조작하지 않고 밖에서 접속 및 활용할 수 있는 계정을 준비하기 위해서이다.

이렇게 안해두면 기본 계정은 wsl 밖에서 접속이 안돼서 불편했다.

 

2. 파일 읽기를 위한 마운트 설정

파일을 클릭하우스에서 바로 읽어서 사용하고싶다면 마운트 설정을 해줘야 한다.

나는 D드라이브에 clickhouse라는 폴더를 만들고 거기에 클릭하우스가 읽을 데이터를 넣어서 설정했다.

 

# ~/clickhouse/docker-compose.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
    restart: unless-stopped

volumes:
  clickhouse_data:
# ~/clickhouse/admin.xml
<clickhouse>
  <users>
    <admin>
      <password>supersecret</password>
      <networks>
        <ip>::/0</ip>  <!-- 모든 IP 허용 -->
      </networks>
      <profile>default</profile>
      <quota>default</quota>
    </admin>
  </users>
</clickhouse>

 

이렇게 두개의 파일을 작성 해두고 도커를 띄운다.

cd ~/clickhouse
docker compose up -d

 

클릭하우스는 재미있는 점이 있는데 HTTP로 쿼리를 날릴 수 있다는 점이다.

localhost:8123으로 접속 해보면 다음과 같이 DB가 잘 실행되고 있다고 표시된다.

위의 과정으로 DB를 실행시킨 후 localhost:8123 접속

 

브라우저 주소창에 다음 쿼리를 날려본다.

http://localhost:8123/?query=SELECT+1

 

먼저 로그인을 하라는 팝업이 하나 나오는데 앞서 admin.xml에 작성해둔 정보로 접속하면 다음과 같이 파일이 다운로드 된다.

id: admin

password: supersecret

 

해당 파일을 열어보면 "SELECT 1"의 쿼리 결과에 맞게 1이 출력되어있다.


DBeaver 연결

편하게 쿼리 하기 위해 DBeaver에 연결한다.

CTRL+SHIFT+N 단축키 또는 왼쪽 상단의 플러그 아이콘 "새 데이터베이스 연결"을 누르면 다음과 같은 화면이 나오고 오른쪽 아래에 있는 ClickHouse를 선택한다.

 

아래와 같이 접속 정보를 저장한다.

Host: localhost

Database/Schema: default
Username: admin

Password: supersecret


테스트 쿼리

테스트로 테이블과 데이터를 만든다.

아래와 같이 9백만 건의 데이터를 생성해서 insert하는 데에 1초가 소요되었다.

CREATE TABLE large_test_data (
    user_id UUID,
    event_time DateTime,
    category LowCardinality(String),
    score Float32
) ENGINE = MergeTree()
ORDER BY (event_time);

INSERT INTO large_test_data
SELECT
    generateUUIDv4() AS user_id,
    now() - toIntervalSecond(number % 10000) AS event_time,
    arrayJoin(['game', 'shop', 'social']) AS category,
    rand() % 10000 / 100.0 AS score
FROM numbers(3000000);

 


0을 하나 더 붙여서 9천만 건의 데이터를 생성하려고 했더니 connection timeout이 발생했다.

그래도 여러번 실행해서 99,900,000 건의 테스트 데이터를 마련했다.

 

다음과 같이 코드별 데이터 수를 조회 하는 데에는 1.83초가 걸렸다.

select category, count(1)
from `default`.large_test_data
group by category 
order by category 
;

 

위에 데이터를 직접 읽어서 쿼리할 수 있도록 설정을 해두어서 다음의 쿼리로 파일을 직접 읽을 수 있는 것을 확인했다.

SELECT *
FROM file('login_20250508.parquet', Parquet)
;

 

내가 알기로 file로 읽은 데이터는 전부 메모리에 올라간다고 한다.

그래서 너무 큰 파일을 읽어서 메모리 부하를 주기보다는 테이블에 insert 해서 사용하는게 올바른 방식인 것 같다.


확실히 많은 양의 데이터에 대한 조회가 빠르다.

데이터 타입이나 쿼리 형식에 대한 이해가 조금 필요한 편인 것 같다.

특히 이번에 몇몇 쿼리를 해보면서 놀랐던 부분은 formatDateTime이라는 함수를 쓸 때 포멧을 지정하는 방식이 너무 다르다는 점이었다.

관심이 있다면 다음 링크를 참고하면 좋다.

 

Functions for Working with Dates and Times | ClickHouse Docs

Documentation for Functions for Working with Dates and Times

clickhouse.com

 

728x90