Apache Superset과 BigQuery 연동하기

오픈 소스 BI툴인 아파치 슈퍼셋은 에어비엔비에서 제작 후 오픈 소스로 공개했다. 타블러 같은 BI툴의 오픈 소스 버전이라고 생각하면 된다.

아파치 라이센스 2.0을 사용하기 때문에 상업적인 사용 및 독자적인 특허권 및 상용 서비스 등도 가능하다.  수정시에도 소스 코드 공개 의무가 없지만 해당 S/W 사용했고 수정했음을 외부에 밝혀야 한다.

아파치 슈퍼셋의 장점은?

  • 자체 개발없이 빠르게 외부에 시각화 대시보드를 제공할 수 있다.
  • 사용 BI 툴 수준의 시각화 기능 지원
  • 대부분의 DB 커넥터 연결을 지원
    • 빅쿼리 실제 연결되는지 테스트 완료
  • 유저 권한 관리 지원
    • 외부 회사에 제공시에 필요함

아파치 슈퍼셋의 단점은?

  • 여러가지 라이브러리가 복잡하게 얿혀있어 소스를 수정하려면 경험많은 개발자가 필요하다.
    • 프론트엔드는 react 프레임워크 경험자가 필요
  • 모바일 앱을 통해 대시보드 뷰어는 그냥 따로 개발해야 한다.

Superset 설치

vmware에서 ubuntu 20.04 버전을 이용하 설치 과정을 테스트해보았다. 설치 과정은 슈퍼셋 홈페이지(https://superset.incubator.apache.org/installation.html)를 참고하였다. 문서와 틀린점은 ubuntu 20.04의 기본 패키지 서버에서 설치할 수 있는 파이썬 버전 3을 사용한다는 점이다.

슈퍼셋에 필요한 기본 패키지를 먼저 설치한다.

sudo apt-get install build-essential libssl-dev libffi-dev libsasl2-dev libldap2-dev

파이썬 관련 패키지를 설치한다. 파이썬 가상환경을 제공하는 virtualenv 내부에 Superset를 설치하는 것이 좋다.

sudo apt-get install python3-pip, python3-venv
sudo pip3 install virtualenv

다음 커맨드를 입력을 통해 파이썬 virtualenv를 만들고 활성화 할 수 있다.

sudo python3 -m venv venv
. venv/bin/activate

이 예제에서는 빅쿼리와의 연동을 테스트하는게 목적이다. deactivate 커맨드를 입력하여 virtualenv를 비활성화한다. 좌측에 (venv) 표시가 사라지는 것을 확인할 수 있다.

이제 Superset 패키지를 설치한다.

sudo pip3 install apache-superset

Superset db를 초기화하고 서버를 실행한다.

sudo superset db upgrade

어드민 계정을 생성한다. 어드민으로 사용한 정보와 암호를 입력하면 된다.

sudo superset fab create-admin

예제 데이터를 생성한 후 슈퍼셋 권한과 역할 정보 생성을 위한 init 커맨드를 입력한다.

sudo superset load_examples
sudo superset init

이제 슈퍼셋 실행에 준비가 모두 완료되었다. 다음 커맨드를 입력하여 슈퍼셋 서버를 시작한다

sudo superset run -p 8088 --with-threads --reload --debugger

웹브라우저를 실행한 후 127.0.0.1:8080을 통해 슈퍼셋 웹페이지에 들어갈 수 있다. 전에 생성해둔 어드민 계정 정보를 입력하여 로그인한다.

예제 데이터를 이용하여 만들어진 각종 도표를 확인할 수 있다.

BigQuery 차트 출력

슈퍼셋에서 빅쿼리 데이타에 접근할려면 추가 패키지를 설치해야 한다.

sudo pip3 install pybigquery

이제 커넥터 패키지가 설치되었으니 연결한 빅쿼리 정보를 추가해야 한다. Superset의 Sources > Databases 메뉴를 선택한다.

GCP 사이트에서 접근할 빅쿼리의 프로젝트 아이디를 복사해온다. 그리고 SQL Alchemy URI에 입력한다.

빅쿼리에 접근하려면 해당 빅쿼리에 접근 권한을 허용한 GCP 서비스어카운트 json 파일이 필요하다. GCP 사이트에서 다운로드 받으면 다음과 같은 속성을 확인할 수 있다.

Extra 속성에는 다음을 입력한다.

{
"metadata_params": {},
"engine_params": {},
"metadata_cache_timeout": {},
"schemas_allowed_for_csv_upload": []
}

그리고 Secure Exter 항목에 다음 서비스어카운트 json 파일에 담긴 모든 내용을 복사한후 credentials_info 속성에 추가한다.

{
  "credentials_info" : {
    "type": "...",
    "project_id": "...",
     ....
    "client_x509_cert_url": "..."
  }
}

화면 하단의 Save 버튼을 클릭하여 저장하면 다음과 같이 데이터베이스 소스에 빅쿼리 커넥터가 추가된 것을 확인할 수 있다.

이제 빅쿼리 테이블에 접근하여 데이터를 출력하는 대시보드를 추가해보자. Superset 메뉴중 Dashboards를 선택한 후 화면 우측에 + 버튼을 클릭한다.

대시보드 이름을 이력하고 Owners를 어드민 유저로 선택한 후 Save 버튼을 클릭한다.

빅쿼리 정보에 접근하려면 접근할 테이블 정보를 추가해야 한다. Superset 메뉴 Sources > Tables를 선택한다.

화면 우측 + 버튼을 클릭하여 테이블 정보를 입력한다

Database 속성을 선택해서 빅쿼리 데이터베이스 소스를 선택한다. 그리고 Table Name에 접근할 테이블 이름을 입력한 후 Save 버튼을 클릭한다. 테이블 이름은 {BIGQUERY_DATASET}.{BIGQUERY_TABLE_NAME} 형식을 가진다.

대시보드에 해당 테이블 정보를 출력하려면 미리 차트 정보를 생성해야 한다. Superset 메뉴 Charts를 선택한후 화면 오른쪽 + 버튼을 클릭한다.

데이타소스를 바로 전에 생성한 테이블 정보로 선택한다.

그리고 Choose a visualization type 메뉴를 통해 표시하고 싶은 차트 방식 선택한다(이 글에서는 Line Chart를 선택) 그리고 Create new chart 버튼을 클릭한다.

이제 해당 테이블을 대상으로 어떻게 차트 정보를 출력할지 편집할 수 있다. Superset이 상용 BI툴과 견줄 수 잇는 부분중의 하나가 이런 비주얼한 편집 기능이다.

화면 좌측의 Run Query를 통해 결과를 확인해가며 원하는대로 차트가 출력되는지 확인해 가면 편집할 수 있다. Save 버튼을 클릭하여 차트 정보를 저장한다.

이제 대시보드에 차트를 추가해보자. Dashboards 메뉴에서 생서한 대시보드를 선택한다. 그리고 Edit dashboar 버튼을 클릭한다.

Your charts & filter 메뉴를 선택한다.

좀전에 추가한 차트인 daily step이 표시되는 것을 확인할 수 있다. 해당 표를 클릭 후 드래그하여 대시보드에 배치한다.

마무리

Superset에서 빅쿼리 테이블과의 연동이 이상없이 동작하는 것을 확인했다. 이 글은 빅쿼리와 연동을 확인하려는 것으로 파이썬 virtualenv를 사용하지 않았고 Superset 서버도 데몬 형태로 실행하지 않았다는 점에 주의하기 바란다.

에어플로우를 통한 스케쥴링 처리

에어플로우 설치

아파치 에어플로우는 데이터 처리 파이프라인을 조율하기 위해 만들어진 오픈 소스 소프트웨어이다. 구글 클라우드 플랫폼은 이를 클라우드 컴포저라는 이름으로 쉽게 사용할 수 있도록 서비스 형태로 제공하고 있다. 하지만 클라우드 컴포저는 쿠버네티스로최소 3개의 워커노드를 사용을 요구하며 그외에 추가적인 부가 사용료를 따져보면 월에 700달러 이상의 요금이 부과된다. 따라서 우리는 컴퓨트 엔진에서 서버 인스턴스를 생성한 후 에어플로우를 설치하는 것으로 한다.

VM 인스턴트 준비하기

에어플로우를 설치할 서버는 구글 컴퓨트엔진을 사용하도록 한다.1. COMPUTE > Compute Engine > VM instances 메뉴를 선택한다.

Datadriver airflow setup1.png

2. CREATE INSTANCES 메뉴를 선택한다.

Datadriver airflow setup2.png

3. 생성할 VM 인스턴트 옵션의 각 항목을 다음과 같이 설정한 후 Create 버튼을 클릭하여 VM 인스턴스를 생성한다.

  • Name: datadriver-airflow
  • Region: asia-northeast1(Tokyo)
  • Zone: asia-northeast1-c
  • Machine type : small(1 shared vCPU)
  • Boot disk: Debian GNU/Linux 9
  • Identifiy and API access
    • Service account: Compute Engine default service account
    • Access scopes : Allow full access to all Cloud APIs
Datadriver-airflow-setup3.png

에어플로우 설치하기

구글 클라우드 플랫폼은 따로 SSH 접속 프로그램 없이도 리눅스 쉘을 실행할 수 있다. 다음과 같인 VM 인스턴스의 SSH 버튼을 눌러서 에어플로우를 설치한 VM 인스턴스에 접속한다.

Datadriver-vm-instance-ssh.png

그리고 쉘에서 다음 명령어를 입력하여 에어플로우를 설치한다. 현재 패키지로 설치되는 에어플로우 버전은 1.10.0 이다. -E를 빠뜨리지 않도록 주의한다. 이 옵션은 사용자가 기존 환경 변수를 보존하기를 원하는 보안 정책을 설정하는 것을 의미한다.

sudo apt-get install -y python3-pip python3-dev build-essential libssl-dev libffi-dev defult-libmysqlclient-dev

export AIRFLOW_GPL_UNIDECODE=y

# Install Airflow with the extra package gcp_api containing the hooks and operators for the GCP services.
sudo -E pip3 install apache-airflow[gcp_api]

AIRFLOW_HOME 위치를 쉘로 접속한 계정의 상위 폴더로 설정한후 에어플로우 데이터베이스를 생성하고 웹서버를 시작한다. -E 옵션을 줘야 AIRFLOW_HOME 위치를 읽을 수 있으므로 빼먹지 않도록 주의한다.

export $AIRFLOW_HOME=~/airflow
sudo -E airflow initdb
sudo -E nohup airflow webserver -p 80 >/dev/null 2>&1 &

에어플로우를 통한 스케쥴링 처리-vm-external-ip.png

에어플로우 웹서버가 시작되었으면 VM 인스턴스의 External IP를 통해 서버에 접속할 수 있다.

브라우저에서 다음과 같은 화면이 나오면 성공적으로 웹서버가 시작된 것이다.

에어플로우를 통한 스케쥴링 처리-web-page.png

에어플로우를 이용해 스케쥴링 처리를 위해서는 스케쥴러 데몬도 실행해야 한다. 이 책에서 데이터 처리를 위해 사용할 서비스는 클라우드 데이터플로우로 자바를 이용해서 개발하므로 쉘에서 다음 명령어를 입력하여 jre 부터 설치를 한다.

sudo apt-get install default-jre

다음 명령어를 통해 스케줄러를 시작한다. 이제 스케쥴러 룰을 정의한 DAG 파일을 처리할 준비가 모두 끝났다.

sudo -E nohup airflow scheduler >/dev/null 2>&1 &

마지막으로 ps ax 명령어로 웹과 스케쥴러 데몬이 모두 정상적으로 떠 있는지 확인한다.

에어플로우를 통한 스케쥴링 처리-psax.png

Hello DAG 작성하기

에어플로우 작업 간의 관계와 흐름을 DAG(Directed Acylic Graph, 방향성 비순환 그래프)로 표현한다. DAG는 파이썬 스크립트를 이용하여 만들어야 한다. 각 작업은 오퍼레이터 클래스를 이용하여 인스턴스화 된다. BashOperator 객체를 이용하여 쉘 명령어를 실행하는 간단한 DAG를 만들어 보자. 먼저 hello_dag.py라는 파이썬 파일을 만들고 다음 소스를 입력한다.

import airflow
from airflow import DAG
from airflow import models
from airflow.operators.bash_operator import BashOperator
from datetime import datetime
from datetime import date, timedelta

# DAG를 언제부터 시작할지 지정한다. 에어플로우에 등록한 이틀 전부터 실행하도록 설정하였다.
default_dag_args = {
        'start_date': airflow.utils.dates.days_ago(2)
}

# 크론탭 방식의 시간 설정 방법으로 DAG의 반복 단위를 설정할 수 있다. 0 0 * * * 은 매일 0시에 실행하라는 의미이다.
dag = models.DAG(
        'hello-dag-v1',
        schedule_interval='0 0 * * *',
        default_args=default_dag_args
)

# BashOperator를 이용하여 echo 커맨드를 실행
run_this = BashOperator(
        task_id='run_bash_operator',
        bash_command='echo hello dag!',
        dag=dag
)

DAG를 등록하려면 VM 인스턴스에 소스파일을 업로드해야 한다. 쉘로 들어간후 다음 명령어로 airflow 폴더 하위에 dags 폴더를 먼저 생성한다. 그리고 스케쥴러와 웹서버를 재실행한다.

cd ~/
sudo mkdir airflow/dags
sudo kill -9 `ps -ef | grep 'scheduler' | grep -v grep | awk '{print $2}'`
sudo -E nohup airflow scheduler >/dev/null 2>&1 &

sudo kill -9 `ps -ef | grep 'webserver' | grep -v grep | awk '{print $2}'`
sudo -E nohup airflow webserver -p 80 >/dev/null 2>&1 &

그리고 cd 명령어로 dags 폴더로 이동후 웹 기반 쉘의 Upload file 메뉴를 통해 hello_dag.py파일을 업로드 한다.Upload files 메뉴는 계정의 홈 폴더로 파일을 업로드하는 기능이다.

내 몸 빅데이터 분석-에어플로우를 통한 스케쥴링 처리-uploadfiles.png

다음 명령어로 홈폴더에 위치한 DAG 파일을 dags 폴더로 이동시킨다.

sudo mv ~/hello-dag.py ~/airflow/dags/

잠시 기다리면 스케쥴러가 DAG를 인식하고 다음 화면과 같이 우리가 작성한 DAG의 이름이 출력된다. OFF라고 적혀있는 토글 버튼을 눌러서 DAG를 활성화 한다.

에어플로우를 통한 스케쥴링 처리-hello-dag-toggle.png

몇분이 지나면 DAG가 우리가 지정한 start_date 부터 시작하고 결과를 보여준다. start_date를 DAG를 활성화한 시점에 이틀전부터 지정했으므로 처리가 완료된 DAG Runs의 갯수가 2개가 뜨는 것을 볼 수 있다.

에어플로우를 통한 스케쥴링 처리-dag-runs-result.png