airbnbが開発したBIツール Apache Superse (incubating) をAWS EC2にdockerで立てたメモ。
AWS EC2 Amazon Linux t2.microで試した。

参考)
supreset GitHub (公式)
https://github.com/ApacheInfra/superset

superset documentation (公式)
https://superset.incubator.apache.org/index.html

関連記事)
http://qiita.com/risuoku/items/618b7d8614325025ab59
http://qiita.com/momota10/items/ee774188f770555238ca
http://qiita.com/hiro_koba/items/65f3e278d86174210776

dockerfile

redashと異なり、現時点(2017.7)では、公式のdockerfileは提供されてない。
公式GitHubに、dockerfileとしてcommunity contributedのリンクがある。
https://github.com/amancevice/superset

そのdockerfileが以下 (一部カスタマイズしてます)

FROM amancevice/pandas:0.19.2-python3

# Superset version
ARG SUPERSET_VERSION=0.18.5

# Configure environment
ENV LANG=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    PATH=$PATH:/home/superset/.bin \
    PYTHONPATH=/home/superset/.superset:$PYTHONPATH \
    SUPERSET_VERSION=${SUPERSET_VERSION}

# Install dependencies & create superset user
RUN apt-get update && \
    apt-get install -y \
        build-essential \
        libsasl2-dev \
        libldap2-dev \
        mariadb-client \
        postgresql-client && \
    pip install \
        flask-mail==0.9.1 \
        flask-oauth==0.12 \
        flask_oauthlib==0.9.3 \
        impyla==0.14.0 \
        mysqlclient==1.3.7 \
        psycopg2==2.6.1 \
        pyhive==0.2.1 \
        pyldap==2.4.28 \
        redis==2.10.5 \
        sqlalchemy-redshift==0.5.0 \
        sqlalchemy-clickhouse==0.1.1.post3 \
        superset==$SUPERSET_VERSION && \
    useradd -b /home -U -m superset && \
    mkdir /home/superset/.superset && \
    touch /home/superset/.superset/superset.db && \
    chown -R superset:superset /home/superset

# Configure Filesysten
WORKDIR /home/superset
COPY superset .
#VOLUME /home/superset/.superset

# Deploy application
EXPOSE 8088
HEALTHCHECK CMD ["curl", "-f", "http://localhost:8088/health"]
ENTRYPOINT ["superset"]
CMD ["runserver -t 300"]
USER superset

timeout 設定

runserverオプションで -t XXをつけると、Sliceのグラフ描画時の
time out時間を拡張できる。
標準設定の場合、45秒でtimeoutしerrorとなるケースでも、
上記設定をしたら、errorが解消された。

docker build & run

上記dockerfileのコピペだけではbuildできない。
以下サイトのリポジトリをcloneしてbuildする
https://github.com/amancevice/superset

git clone https://github.com/amancevice/superset.git

cd superset

docker build -t superset:0.18.5 .

docker run -p 80:8088 --name superset  superset:0.18.5

デーモン起動 & Volume指定の場合は

docker run -d -p 80:8088 -v /home/hoge:/home/superset/.superset --name superset superset:0.18.5

次に、databaseの初期化とadminユーザの設定を行う

docker exec -it superset superset-init

ブラウザでsupersetの画面にログイン

コンテナが正常起動したら、ブラウザで起動したサーバにアクセス。(port 80指定としたが、変更可能)

supersetはpythonのwebアプリケーション用フレームワークであるFlaskをベースに作成されていて、WEBサーバ機能も持っているので、nginxやapacheなどのWEBサーバアプリケーションを別途立てなくても一応使える。
dockerfile内のrunserverコマンドがWEBサーバ機能実行コマンド。

初期化時に設定したID/PWDでログインすればOK

スクリーンショット 2017-07-01 21.43.33.png

dashboard作成

dashboardを作るには以下の順番で行う必要あり

1) Sources/Databaseを登録
2) Tableを設定
3) Sliceを設定
4) Dashboardを作成

sliceはいわゆるグラフで、そのsliceをdashboardに貼り付けるイメージ。
そのsliceの入力元データのdbとtableを事前に設定する。

スクリーンショット 2017-07-01 21.51.17.png

以下がdatabase設定画面。
RDS(Postgresql)であれば、SQLAlchemy URIには
postgresql://[user]:[password]@[IP or Domain]:[port]/[dbname]
のフォーマットで規定する。ほとんどのDBには対応している模様。

スクリーンショット 2017-07-01 21.59.36.png

Sliceの種類が豊富で、GUIだけでビジュアライズが可能。
SQLを規定するSQL Labもある。

スクリーンショット 2017-07-01 21.53.50.png

スクリーンショット 2017-07-01 21.54.02.png

スクリーンショット 2017-07-01 21.54.13.png

スクリーンショット 2017-07-01 21.54.20.png

SQL Lab

通常のSliceでは、ベースとなるテーブルのカラムを組み合わせてのグラフ化だが、
SQL Labを使うと、複数テーブルのJoinなど自由にSQLで抽出した結果をベースに
グラフ化が可能。

sqllab.png
 ※画面イメージはGitHub superset公式より

基本的には、「Sources」-「Databases」メニューでデータベース情報を登録した上で、「SQL Lab」で任意のSQLを実行する。
Databasesの設定では、「Expose in SQL Lab」にチェックを付ける必要あり。

クエリ結果から、「Visualize」ボタンでそのままSlice(グラフ)の作成が可能。

そこで、AWS RDS/Redshiftを利用した環境で、SQL Labでクエリを実行した際に以下の
エラーが出てハマったので記載する。

Failed to start remote query on a worker. Tell your adinistrator to verify the abailability of the message queue

対処は、「Sources」-「Databases」の対象DBの編集画面にて、
「Allow Run Sync」にチェックをして、かつ
「Allow Run Async」のチェックをはずして保存することで実行できるようになった。

データのバックアップ

supersetのデータはSQLite3で管理され、dockerコンテナ内の
/home/superset/.superset/superset.db
に格納される。
Dockerfileでコメントアウトした VOLUMEを有効化すると、
/home/superset/.superset をVOLUMEでマウントし、
ホスト側マウント先が未設定なので、dockerが勝手にマウント先を規定する。

例)
/var/lib/docker/volumes/[volume ID]/_data/

docker inspect コマンドで詳細は確認できる。

docker inspect 実行例

        "Mounts": [
            {
                "Name": "49313286a6f90d4dd5ad4d0222d7eb3a57d53f21f69a254ea56bbfb77517055b",
                "Source": "/var/lib/docker/volumes/49313286a6f90d4dd5ad4d0222d7eb3a57d53f21f69a254ea56bbfb77517055b/_data",
                "Destination": "/home/superset/.superset",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

なお、任意でホストマウント先を指定しても良い。

VOLUME [コンテナ内部パス] [ホストマウント先パス]

その他

さすがにTableauほど多機能ではないにせよ、
現時点では、AWSのQuicksightより断然イケてる気がする。
オンプレなどクローズドな環境へも容易にインストールできて重宝する。