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
##dashboard作成
dashboardを作るには以下の順番で行う必要あり
- Sources/Databaseを登録
- Tableを設定
- Sliceを設定
- Dashboardを作成
sliceはいわゆるグラフで、そのsliceをdashboardに貼り付けるイメージ。
そのsliceの入力元データのdbとtableを事前に設定する。
以下がdatabase設定画面。
RDS(Postgresql)であれば、SQLAlchemy URIには
postgresql://[user]:[password]@[IP or Domain]:[port]/[dbname]
のフォーマットで規定する。ほとんどのDBには対応している模様。
Sliceの種類が豊富で、GUIだけでビジュアライズが可能。
SQLを規定するSQL Labもある。
##SQL Lab
通常のSliceでは、ベースとなるテーブルのカラムを組み合わせてのグラフ化だが、
SQL Labを使うと、複数テーブルのJoinなど自由にSQLで抽出した結果をベースに
グラフ化が可能。
基本的には、「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より断然イケてる気がする。
オンプレなどクローズドな環境へも容易にインストールできて重宝する。