この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは!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に接続してみました!セットアップさえうまくできれば、何の問題もなく接続できたので、とても良い感じでした。今後、もう少し色々な画面も触っていきたいと思います。
どなたかのお役に立てば幸いです。それでは!