BIツール superset をdockerでインストール

airbnbが開発したBIツール Apache Superset (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](https://qiita-image-store.s3.amazonaws.com/0/112537/6dc248d2-6c95-4205-7ede-20861715eb88.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](https://qiita-image-store.s3.amazonaws.com/0/112537/e2e16202-c61e-ebcb-5f0a-8571e8bbffe7.png)

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

![スクリーンショット 2017-07-01 21.59.36.png](https://qiita-image-store.s3.amazonaws.com/0/112537/199db76c-8c5a-d92c-de35-71896c463fea.png)



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

![スクリーンショット 2017-07-01 21.53.50.png](https://qiita-image-store.s3.amazonaws.com/0/112537/4327e9b3-3db0-b190-b118-dff806328d3b.png)

![スクリーンショット 2017-07-01 21.54.02.png](https://qiita-image-store.s3.amazonaws.com/0/112537/9bebd294-2671-0a49-7556-599c04e7a325.png)

![スクリーンショット 2017-07-01 21.54.13.png](https://qiita-image-store.s3.amazonaws.com/0/112537/4f52fc27-ef77-2687-5d17-17a2b33b82d0.png)

![スクリーンショット 2017-07-01 21.54.20.png](https://qiita-image-store.s3.amazonaws.com/0/112537/4ae782bb-1d14-715e-c696-294835343a59.png)

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

![sqllab.png](https://qiita-image-store.s3.amazonaws.com/0/112537/7200021a-454f-1231-3eba-21beb0bd75ca.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より断然イケてる気がする。
オンプレなどクローズドな環境へも容易にインストールできて重宝する。