팀 이야기

[스프링팀] Druid

MASHUP 2023. 8. 31. 17:50

Druid 란?

Druid 공식 문서: https://druid.apache.org/docs/latest/design/

  • 대규모 데이터에 대한 빠른 OLAP 쿼리를 위해 설계된 실시간 분석 데이터베이스, interactive한 분석을 가능하게 함
  • 짧은 시간(3초 이내)에 대용량 데이터에 대해 interactive한 분석을 가능하게 함
  • OLAP란
    • 대용량 업무 데이터베이스를 구성하고 BI(Business Intelligence)를 지원하기 위해 사용되는 기술
    • 데이터 웨어하우스나 데이터 마트와 같은 대규모 데이터에 대해 최종 사용자가 정보에 직접 접근하여 대화식으로 정보를 분석하고 의사결정에 활용할 수 있는 실시간 분석처리

 

Druid 사용례

  • 웹 및 모바일 분석을 포함한 클릭스트림 분석
  • 네트워크 성능 모니터링을 포함한 네트워크 원격 측정 분석
  • 서버 메트릭 스토리지
  • 제조 지표를 포함한 공급망 분석
  • 애플리케이션 성능 지표
  • 디지털 마케팅/광고 분석
  • 비즈니스 인텔리전스/OLAP

 

특징

  • Columar 로 데이터를 저장(mysql 등 일반 저장소는 row기반)
  • 확장 가능한 분산 시스템. 일반적인 Druid 배포는 수십에서 수백 개의 서버에 클러스터링 하여 배포.
    • 초당 수백만개의 레코드 속도로 데이터를 수집하는 동시에 수조 개의 레코드를 유지하고 쿼리 대기 시간을 1초 미만에서 몇 초까지 유지
  • 대규모 병렬 처리
    • Druid는 전체 클러스터에서 각 쿼리를 병렬로 처리할 수 있음
  • 실시간 또는 일괄 처리
    • Druid는 데이터를 실시간 또는 일괄 처리할 수 있고, 수집된 데이터는 쿼리에 즉시 사용할 수 있음
  • 시간 기반 파티셔닝
    • Druid는 먼저 데이터를 시간별로 분할합니다. 선택적으로 다른 필드를 기반으로 추가 파티셔닝을 구현할 수 있습니다. 시간 기반 쿼리는 쿼리의 시간 범위와 일치하는 파티션에만 액세스하므로 성능이 크게 향상됩니다.
  • approximate 알고리즘
    • Druid에는 approximate dinstinct count, approximate rank등의 계산을 위한 알고리즘이 포함되어 있습니다. 이러한 알고리즘은 적은 메모리 사용을 제공하며 정확한 계산보다 훨씬 빠름
    • hyperloglog 알고리즘 사용

 

Druid 구조

  • Coordinatiors: 클러스터의 데이터 가용성을 관리 (세그먼트 로드, 세그먼트 삭제, 세그먼트 레플리케이션 …)
  • Overlord: 데이터 수집 워크로드 할당을 제어
  • Brokers: 외부 클라이언트의 쿼리를 처리
  • Routers: 선택 사항입니다. broker, coordinator, overload 에게 요청을 라우팅
  • Historical: 쿼리 가능한 데이터를 저장
  • MiddleManager: 데이터를 수집

 

Druid 실습 w.Turnilo

본 실습은 Mac OS 환경에서 수행되었으며, Druid의 Cluster 구조가 아닌 Standalone 모드로 수행되었습니다. 실제 서비스 환경에서는 Cluster 환경으로 구축하여 사용하시는 것을 추천드립니다.

 

1. Druid 다운로드 및 실행

wget https://dlcdn.apache.org/druid/25.0.0/apache-druid-25.0.0-bin.tar.gz
tar -xzf apache-druid-25.0.0-bin.tar.gz
cd apache-druid-25.0.0
./bin/start-druid

2. Druid UI 접속

http://localhost:8888

3. Load Data에서 원하는 저장소 선택

- 실습에서는 batch classic -> example data 선택 (위키피디아 사전 데이터)

4. Parse Data, Parse Time, Submit

각 필드들을 정의, 시간에 대한 필드 정의 후 Submit 하여 ingestion을 수행함.

최종 ingestion spec은 json 형식으로 제출되어 ingestion이 수행됨.

5. Query

SQL 쿼리를 통해 ingestion 된 데이터를 질의

Druid는 Columar 형식으로 저장하므로, dimension(필드) 기준으로 group by 연산하는 것에 빠른 속도를 보여줌

6.  추가적으로 실제 데이터, Turnilo 활용한 실습

1) Kaggle에서 적합한 데이터를 찾아 다운

본 실습에서는 ecommerce 데이터를 활용

https://www.kaggle.com/datasets/mkechinov/ecommerce-events-history-in-cosmetics-shop

 

eCommerce Events History in Cosmetics Shop

This dataset contains 20M users' events from eCommerce website

www.kaggle.com

2) ingestion_spec 정의 후 submit

크게 '파일의 위치', 'dimension(필드들)', metrics, granularity(묶는 시간 단위)를 정의

{
  "type": "index_parallel",
  "spec": {
    "ioConfig": {
      "type": "index_parallel",
      "inputSource": {
        "type": "local",
        "baseDir": "/Users/user/Desktop/data",
        "filter": "*.csv"
      },
      "inputFormat": {
        "type": "csv",
        "findColumnsFromHeader": true
      }
    },
    "tuningConfig": {
      "type": "index_parallel",
      "partitionsSpec": {
        "type": "dynamic"
      }
    },
    "dataSchema": {
      "dataSource": "shopping",
      "timestampSpec": {
        "column": "event_time",
        "format": "auto"
      },
      "dimensionsSpec": {
        "dimensions": [
          "event_type",
          "product_id",
          "category_id",
          "category_code",
          "brand",
          {
            "type": "double",
            "name": "price"
          },
          "user_id",
          "user_session"
        ]
      },
      "metricsSpec": [
        {
          "type": "hyperUnique",
          "name": "user_id_uv",
          "fieldName": "user_id",
          "isInputHyperUnique": false,
          "round": false
        },
        {
          "type": "hyperUnique",
          "name": "user_session_uv",
          "fieldName": "user_session",
          "isInputHyperUnique": false,
          "round": false
        }
      ],
      "granularitySpec": {
        "queryGranularity": "HOUR",
        "rollup": true
      }
    }
  }
}

3) turnilo 설치

brew install node

npm install -g turnilo
turnilo connect-druid http://localhost:8888


http://localhost:9090 접속후, UI 로 데이터 분석

- UI로 pivot table처럼 분석이 가능하여 쿼리를 모르는 기획자, 마케터들도 손쉽게 데이터를 분석하고 이를 레포트에 활용 가능

전날 발생한 브랜드별 매출
시간대별 브랜드별 매출 분석
시간대별로 발생한 쇼핑 이벤트 추이 분석