2021. 3. 28. 22:57

Druid + superset로 BI 아키텍쳐 구축하기

드루이드란?


  • Druid는 대량의 트랜잭션 이벤트를 ingestion하고 탐색할 수 있도록 지원하는 엔진이다.
  • 실시간과 시계열 데이터에서 100ms 이하의 쿼리 응답속도를 위해 설계된 오픈 소스 데이터 저장소
  • 실시간/배치 데이터로 데이터를 수집해서 빠르게 BI쿼리(OLAP)를 처리, 분석하는 목적으로 사용
  • 데이터 roll-up을 통해서 ingestion되는 원천 데이터를 취합할 수 있다. roll-up을 하면 원천 데이터의 저장 용량을 최소화 할 수 있고 스토리지 리소스를 절약하고 쿼리 속도를 빠르게 하지만 개별 이벤트들에 대해 쿼리할 수 없게 된다.

 

OLAP(On-Line Analytical Processing)?

  • OLAP, 온라인 분석 처리는 다차원 데이터 구조를 이용하여 다차원의 복잡한 질의를 고속으로 처리하는 데이터 분석 기술이다. 기업의 분석가, 관리자 및 임원들은 OLAP 기술을 통해 필요한 정보에 대해 대화형으로 빠르게 접근 가능하다.
  • OLAP는 다차원 정보를 관련자들이 공유해 빠르게 분석하는 과정을 뜻하고 이 과정에서 사용되는 도구가 OLAP 툴이다. Druid는 웹 OLAP 툴이다.

 

Druid Architecture

  • Historical Nodes 히스토리컬 노드는 딥 스토리지에서 세그먼트를 다운로드하고 이러한 세그먼트에 대한 브로커 노드의 쿼리 실행을 하여 결과를 브로커 노드에 리턴한다. 히스토리컬 노드는 데이터를 공유하지 않으며 Zookeeper를 사용한다.
  • Broker Nodes 브로커 노드를 통해 쿼리를 받고 데이터를 제공한다. 브로커 노드는 쿼리 분산 실행 및 결과 수집, 병합을 담당한다. 브로커 노드도 쿼리 실행을 위해 리얼타임 노드와 히스토리컬 노드가 어떤 것인지를 판단할 때 Zookeeper를 사용한다.
  • Coodinator Nodes 코디네이터 노드는 드루이드 클러스터의 히스토리컬 노드에 있는 세그먼트를 관리한다. 코디네이터 노드는 히스토리컬 노드에 새로운 세그먼트를 로드, 이전 세그먼트 삭제 및 균형을 맞추기 위한 세그먼트 이동을 지시한다. (히스토리컬 노드에 지시하기 위해 Zookeeper 사용)
  • Realtime Nodes 드루이드에서 실시간 처리는 독립형 실시간 노드를 사용하거나 인덱싱 서비스로 할 수 있다. 실시간 처리 로직은 두 서비스가 동일하다. 실시간 처리는 데이터 수집, 데이터 인덱싱 (세그먼트 작성) 및 세그먼트를 히스토리컬 노드에 전달한다. 실시간 처리 로직에 의해 집계된 데이터는 즉시 질의가 가능하다.
  • apache zookeeper 드루이드 외부 디펜던시. 클러스터 내부에서의 회복성 있는 분산 설정 서비스다. 다수결의 원칙에 따라 합의를 이끌어내므로 홀수의 서버에 배포된다. 짝수의 서버에 배포될 수도 있지만 그중 한대는 회복성 확보에 전혀 도움이 되지 않는다. 각 서버는 기능적으로 동일하지만 어떤 서버를 리더로 할지 나머지를 팔로워할지를 지정하는 것을 주키퍼에서 다수결에 의해 결정한다.

 

요구사항


  • Linux, Mac OS X, or 유닉스 기반 OS(윈도우는 지원되지 않음)
  • Java 8, Update 92 or later (8u92+)

먼저 Java가 설치 되어 있어야한다. 오라클 라이센스 정책 변경에 따라 oracle-java8-installer로 설치가 불가능하다. 오라클 사이트에서 소스 파일로 직접 설치하거나 OpenJDK를 이용해야 한다.

sudo apt-get install apenjdk-8-jdk // java -version openjdk version "1.8.0_272" OpenJDK Runtime Environment (build 1.8.0_272-8u272-b10-0ubuntu1~20.04-b10) OpenJDK 64-Bit Server VM (build 25.272-b10, mixed mode)

 

Druid 설치


tar -xzf apache-druid-0.20.0-bin.tar.gz cd apache-druid-0.20.0

 

Druid 실행(Single server deployment)


  • 클러스터로 서버를 구성하지 않고 싱글 서버로 구성하는 경우, ec2 인스턴스 사이즈에 따라서 실행 명령어와 설정 폴더가 달라진다. 기본 포트번호는 8888

Nano-Quickstart: 1 CPU, 4GB RAM

  • Launch command: bin/start-nano-quickstart
  • Configuration directory: conf/druid/single-server/nano-quickstart

Micro-Quickstart: 4 CPU, 16GB RAM

  • Launch command: bin/start-micro-quickstart
  • Configuration directory: conf/druid/single-server/micro-quickstart

Small: 8 CPU, 64GB RAM (~i3.2xlarge)

  • Launch command: bin/start-small
  • Configuration directory: conf/druid/single-server/small

Medium: 16 CPU, 128GB RAM (~i3.4xlarge)

  • Launch command: bin/start-medium
  • Configuration directory: conf/druid/single-server/medium

Large: 32 CPU, 256GB RAM (~i3.8xlarge)

  • Launch command: bin/start-large
  • Configuration directory: conf/druid/single-server/large

X-Large: 64 CPU, 512GB RAM (~i3.16xlarge)

  • Launch command: bin/start-xlarge
  • Configuration directory: conf/druid/single-server/xlarge

 

Kafka설치


  • 데이터를 드루이드에 넣기 위한 용도로 Kafka를 사용
curl -O <https://archive.apache.org/dist/kafka/2.6.0/kafka_2.13-2.6.0.tgz> tar -xzf kafka_2.13-2.6.0.tgz cd kafka_2.13-2.6.0
  • 설치된 폴더에서 다음 명령어로 실행
./bin/kafka-server-start.sh config/server.properties

드루이드에 데이터를 ingestion하는 방법에는 여러가지가 있다. json파일로 커맨드에서 배치로 넣는 형태, s3나 하둡, 키네시스 등을 이용하는 방법들이 존재한다. 일단 기존에 가지고 있는 데이터의 형태를 고려해야하는데, 드루이드는 특유의 Data format을 일정하게 가져야 하므로(참조 : druid.apache.org/docs/latest/ingestion/data-formats.html) 따로 데이터를 포맷팅 해주어야하므로 편의상 카프카를 사용했다.

드루이드는 로그데이터와 같은 실시간성에 가장 큰 장점이 있는 데이터 베이스이므로 카프카를 이용해 복잡한 아키텍처들을 메시지 큐잉으로 한대 묶어서 드루이드를 사용한다면 데이터레이크 아키텍쳐를 구축하는 것에 있어서 큰 강점을 가질 수 있다.

Druid에 Data Ingestion


  • 드루이드 실행 후 Load Data 클릭(native batch 파일로도 데이터를 전송할 수 있지만 내부 모듈로 간편하게 batch 파일을 생성할 수 있다.)
  • Start a new spec→Apache Kafka→Connect Data

  • kafka의 포트와 ingestion할 데이터의 토픽 이름을 적어주고 Apply를 누른다.

  • 객체 안에 객체가 들어있는 경우는 Auto add flatten spacs를 눌러서 컬럼을 펼쳐 주어야 한다.
  • Configure schema 설정에서 Explicitly specify dimension list와 Rollup을 설정할 수 있는데 Explictly specify dimension list는 dimension을 자동으로 Metric으로 계산해준다.
  • Rollup은 시간,분,날을 기준으로 granularity를 설정해서 취합할 수 있다. roll-up은 원천 데이터의 저장 용량을 최소화하고 쿼리 속도를 빠르게 하지만 개별 이벤트에 대해 쿼리할 수 없다.
  • 필요한 경우가 아니라면 자동으로 metric으로 변경된 것이라도 dimension으로 바꿔주자
  • Tune탭에서 use earliest offset을 True로 설정해준다. 카프카 오프셋 데이터 중에서 가장 먼저 것부터 가져온다.
  • publish에서 Log parse exceptions를 True로 해주면 로그 데이터가 보인다. 디버깅할 때는 이걸 키고 ingestion하기.

 

superset 설치


  • docker로 설치를 제공함 따라서 docker 설치가 선행되어야 함(엔진과 compose 모두 설치)

Install Docker Engine on Ubuntu

 

Install Docker Engine on Ubuntu

 

docs.docker.com

$ git clone <https://github.com/apache/incubator-superset.git>

superset 저장소를 클론 받아서 해당하는 저장소로 이동한 다음에 docker로 실행

docker-compose up
  • superset의 기본 포트는 8088
  • su를 통해 관리자 권한을 얻어서 실행하거나 아래 링크를 통해 non-root user를 등록해주어야 한다.

Post-installation steps for Linux

 

Post-installation steps for Linux

 

docs.docker.com

superset과 Druid 연결하기


  • 슈퍼셋 기본 관리자 계정 정보
username: admin 
password: admin

superset은 https가 아니라 http로 접속해주어야 한다.

  • default 계정 정보는 ./docker-init.sh에서 수정 후 아래 명령어를 통해 초기화
docker-compose run -e SUPERSET_LOAD_EXAMPLES=yes --rm superset ./docker-init.sh
  • config.py의 DRUID_IS_ACTIVE를 True로 설정
  • 메뉴에 Data→Druid Cluster에서 오른쪽 위의 + 아이콘을 선택

위와 같이 설정, 드루이드는 로컬에 설치하고 superset은 도커 상에 설치되어 있을 때는 Broker Host를 host.docker.internal 로 잡아 주어야 한다. 따로 localhost의 특정 포트와 이어주는 방법도 있지만 이것은 도커의 설정이므로 이 문서에서는 생략하도록 한다.