Apache SupersetでSnowflakeに接続してみた

2021.02.05

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日「Apache Superset」のセットアップを試したのですが、Supersetではデータの接続元として各種データベースがサポートされています。

今回はこの中でも、Snowflakeへの接続を試したいと思います。

なお、先日セットアップを試した際のエントリはこちらとなります。

前提

環境は以下で試しています。

  • OS
    • macOS Catalina
  • Docker Desktop
    • 2.3.0.3

セットアップ

Snowflakeに接続するべく、改めてセットアップの見直しを行います。

セットアップ時に、各種データベースへ接続するためのドライバインストールを実施したいと思いますので、以下のように設定し直してみました。

ディレクトリ構成

ディレクトリ構成としては、今回は以下のようにしました。

superset
┣ build
┃ ┗ superset
┃   ┣ Dockerfile
┃   ┗ requirements.txt
┣ .env
┗ docker-compose.yml

.env

Supersetに初期登録する管理者アカウント情報を.envファイルに切り出してみました。値は適宜変更してください。

.env

SUPERSET_ADMIN_USERNAME=admin
SUPERSET_ADMIN_FIRSTNAME=Superset
SUPERSET_ADMIN_LASTNAME=Admin
SUPERSET_ADMIN_EMAIL=admin@superset.com
SUPERSET_ADMIN_PASSWORD=admin

docker-compose.yml

docker-compose.ymlは以下のとおりです。ポートのマッピングはそのまま8080にマッピングし、ビルド時に.envファイルの設定を参照できるようにargsにそれぞれ環境変数を設定しています。

docker-compose.yml

version: "3.7"

services:
  superset:
    build:
      context: ./build/superset
      args:
        SUPERSET_ADMIN_USERNAME: $SUPERSET_ADMIN_USERNAME
        SUPERSET_ADMIN_FIRSTNAME: $SUPERSET_ADMIN_FIRSTNAME
        SUPERSET_ADMIN_LASTNAME: $SUPERSET_ADMIN_LASTNAME
        SUPERSET_ADMIN_EMAIL: $SUPERSET_ADMIN_EMAIL
        SUPERSET_ADMIN_PASSWORD: $SUPERSET_ADMIN_PASSWORD
    ports:
      - "8080:8080"

requirements.txt

Supersetで利用したいデータベースドライバですが、すべてpipでのインストールとなるので、このファイルに分離して指定しています。

今回はドキュメントに記載されているものを全部設定してみましたが、お好みで指定してください。

build/superset/requirements.txt

PyAthenaJDBC>1.0.9
PyAthena>1.2.0
sqlalchemy-redshift
sqlalchemy-drill
pydruid
pyhive
impala
kylinpy
pinotdb
sqlalchemy-solr
pymssql
pybigquery
sqlalchemy-clickhouse
cockroachdb
sqlalchemy_dremio
elasticsearch-dbapi
sqlalchemy-exasol
gsheetsdb
psycopg2
ibm_db_sa
mysqlclient
cx_Oracle
sqlalchemy-hana
snowflake-sqlalchemy
sqlalchemy-teradata
sqlalchemy-vertica-python

Dockerfile

Dockerfileは以下のようにしています。

pipについてですが、最新版のpipは依存関係の解決を考慮してくれるので、更新をかけています。また、unixodbc-devもデータベースドライバのインストール時に必要だったので、インストールしています。

build/superset/Dockerfile

FROM apache/incubator-superset:latest

# args
ARG SUPERSET_ADMIN_USERNAME
ARG SUPERSET_ADMIN_FIRSTNAME
ARG SUPERSET_ADMIN_LASTNAME
ARG SUPERSET_ADMIN_EMAIL
ARG SUPERSET_ADMIN_PASSWORD

# Switching to root to install the required packages
USER root

# Upgrade pip
RUN pip install --upgrade pip

# Install for pyodbc
RUN apt-get update
RUN apt-get install -y unixodbc-dev

# Installing drivers to connect datasources
ADD ./requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt

# Switching back to using the `superset` user
USER superset

# Setup local admin account
RUN superset fab create-admin \
                 --username ${SUPERSET_ADMIN_USERNAME} \
                 --firstname ${SUPERSET_ADMIN_FIRSTNAME} \
                 --lastname ${SUPERSET_ADMIN_LASTNAME} \
                 --email ${SUPERSET_ADMIN_EMAIL} \
                 --password ${SUPERSET_ADMIN_PASSWORD}

# Migrate local DB to latest
RUN superset db upgrade

# Load Examples
RUN superset load_examples

# Setup roles
RUN superset init

ビルド&立ち上げ

あとはdocker-compose.ymlファイルと同階層に移動して、docker-composeコマンドで、ビルド&立ち上げを行います。

$ docker-compose up -d

しばらくして(10分程度) Creating superset_superset_1 ... done と表示されたら完了です。

アクセスしてSnowflakeに接続してみる

では、実際にブラウザでアクセスしてみます。http://localhost:8080 にアクセスするとログイン画面が表示されますので、.envファイルに記載したユーザ名とパスワード(今回はadmin,admin)を入力してログインします。

データベース設定の追加

ログインできたら「Data > Databases」の画面を開き、「+ DATABASE」から接続をしてみます。

Snowflakeへの接続文字列は以下になるので、適宜環境に合わせて設定します。

snowflake://{user}:{password}@{account}.{region}/{database}?role={role}&warehouse={warehouse}

例として、以下のような感じとなります。

snowflake://foo:bar@foobar.ap-northeast-1.aws/SNOWFLAKE_SAMPLE_DATA?role=FOOBAR_ROLE&warehouse=X_SMALL_WH

「TEST CONNECTION」でうまく接続できたら、「ADD」で追加します。

データセットの追加

今度は「Data > Datasets」の画面を開き、「+ DATASET」からデータセットを追加します。

データベース、スキーマ、テーブルを指定して「ADD」で追加して終わりです。

チャートの作成

同様にして「Charts」の画面の、「+ CHART」からチャートを追加します。

先程追加したデータセットを選択し、Visualization Typeには「Line Chart」を選択して「CREATE NEW CHART」をクリックします。

あとは分析したいようにチャートを作成します。今回は1998年における週毎のオーダーレコード数を簡単に可視化してみました。(範囲指定、ちょっと間違えてしまっていますが)

まとめ

以上、Apache SupersetでSnowflakeに接続してみました!セットアップさえうまくできれば、何の問題もなく接続できたので、とても良い感じでした。今後、もう少し色々な画面も触っていきたいと思います。

どなたかのお役に立てば幸いです。それでは!