Apache SupersetでSnowflakeに接続してみた
こんにちは!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
ファイルに切り出してみました。値は適宜変更してください。
SUPERSET_ADMIN_USERNAME=admin SUPERSET_ADMIN_FIRSTNAME=Superset SUPERSET_ADMIN_LASTNAME=Admin [email protected] SUPERSET_ADMIN_PASSWORD=admin
docker-compose.yml
docker-compose.ymlは以下のとおりです。ポートのマッピングはそのまま8080
にマッピングし、ビルド時に.env
ファイルの設定を参照できるようにargsにそれぞれ環境変数を設定しています。
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でのインストールとなるので、このファイルに分離して指定しています。
今回はドキュメントに記載されているものを全部設定してみましたが、お好みで指定してください。
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
もデータベースドライバのインストール時に必要だったので、インストールしています。
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:[email protected]/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に接続してみました!セットアップさえうまくできれば、何の問題もなく接続できたので、とても良い感じでした。今後、もう少し色々な画面も触っていきたいと思います。
どなたかのお役に立てば幸いです。それでは!