データソースは現状RDBMSのみ、かつSSHポートフォワーディングしてDBに接続することが多い環境で、BIツールの導入を依頼された。
SSHポートフォワードを別途autosshなどで設定しないといけないRedashより、デフォルトで対応しているMetabaseのほうが楽かと思い試してみた。
以前BIツールを導入したときは、Metabase v0.30.4がすこし不安定だったのでRedash 5.0.0.b4754を使った覚えがあり不安だったが、ひとまず起動成功。
最初は設定用DBをMySQLにしたが、MySQLの設定周りでちょこちょこつまづいたので、最終的にはPostgreSQLにした。とりあえずメモ。
環境
Windows 10 Pro 64bit, Docker Desktop v2.1.0.1, Metabase v0.32.10。
参考
公式の Running Metabase on Docker を参考にした。
Specific Problems より、メモリ指定もしておく。
MySQLで動かす
以下のスクリプトを実行して、もろもろの設定ファイルを作成。MySQLの設定は詳しくないので適当。
#!/bin/bash MB_DB_DBNAME=metabase MB_DB_USER=metabaseuser # mysql mkdir -p mysql/conf.d mysql/initdb.d { \ echo '[mysqld]'; \ echo 'character-set-server = utf8mb4'; \ echo 'collation-server = utf8mb4_bin'; \ echo 'explicit-defaults-for-timestamp = true'; \ echo ''; \ echo '[client]'; \ echo 'default-character-set = utf8mb4'; \ } | tee mysql/conf.d/my.cnf echo "GRANT ALL PRIVILEGES ON ${MB_DB_DBNAME}.* TO ${MB_DB_USER}@'%';" > mysql/initdb.d/grant.sql # docker { \ echo "MB_DB_DBNAME=${MB_DB_DBNAME}"; \ echo "MB_DB_USER=${MB_DB_USER}"; \ echo 'MB_DB_PASSWORD='metabasepassword; \ echo 'MB_DB_ROOT_PASSWORD='rootpassword; \ } | tee .env
こんな docker-compose.yml を用意。
version: "3" services: metabase_mysql: image: mysql:5.7.27 ports: - "3306:3306" volumes: - ./mysql/initdb.d:/docker-entrypoint-initdb.d - ./mysql/conf.d/my.cnf:/etc/mysql/conf.d/my.cnf - metabase_mysql_data:/var/lib/mysql environment: - MYSQL_DATABASE=${MB_DB_DBNAME} - MYSQL_USER=${MB_DB_USER} - MYSQL_PASSWORD=${MB_DB_PASSWORD} - MYSQL_ROOT_PASSWORD=${MB_DB_ROOT_PASSWORD} - TZ=Asia/Tokyo metabase: image: metabase/metabase:v0.32.10 ports: - "3000:3000" environment: - MB_DB_TYPE=mysql - MB_DB_HOST=metabase_mysql - MB_DB_PORT=3306 - MB_DB_DBNAME=${MB_DB_DBNAME} - MB_DB_USER=${MB_DB_USER} - MB_DB_PASS=${MB_DB_PASSWORD} - JAVA_TOOL_OPTIONS=-Xmx2g - JAVA_TIMEZONE=Asia/Tokyo depends_on: - metabase_mysql volumes: metabase_mysql_data: driver: local
docker-compose run metabase_mysql
でMySQLの初回起動を行っておかないと、Metabaseの初期化開始前にMySQLが起動完了せず初期化に失敗する模様。
Ctrl + c
でMySQLを停止してから docker-compose down
し docker-compose up
。
PostgreSQLで動かす
以下のスクリプトを実行して、 .env を作成。
#!/bin/bash MB_DB_USER=metabase { \ echo "MB_DB_DBNAME=${MB_DB_USER}"; \ echo "MB_DB_USER=${MB_DB_USER}"; \ echo 'MB_DB_PASS='metabasepassword; \ } | tee .env
MySQLと同じく docker-compose.yml を用意。
version: "3" services: metabase_postgres: image: postgres:10.10 ports: - "5432:5432" volumes: - metabase_postgres_data:/var/lib/postgresql/data environment: - POSTGRES_DB=${MB_DB_DBNAME} - POSTGRES_USER=${MB_DB_USER} - POSTGRES_PASSWORD=${MB_DB_PASS} - TZ=Asia/Tokyo metabase: image: metabase/metabase:v0.32.10 ports: - "3000:3000" environment: - MB_DB_TYPE=postgres - MB_DB_HOST=metabase_postgres - MB_DB_PORT=5432 - MB_DB_DBNAME=${MB_DB_DBNAME} - MB_DB_USER=${MB_DB_USER} - MB_DB_PASS=${MB_DB_PASS} - JAVA_TOOL_OPTIONS=-Xmx2g - JAVA_TIMEZONE=Asia/Tokyo depends_on: - metabase_postgres volumes: metabase_postgres_data: driver: local
MySQLと違い、直接 docker-compose up
しても、Metabaseの初期化開始前にPostgreSQLが起動してくれる。
管理者アカウント作成
出力に INFO metabase.core :: Metabase Initialization COMPLETE
が表示されたら初期化完了。
http://localhost:3000/ を開き、「開始しましょう」ボタンをクリック。
「1. 何とお呼びしましょうか?」で管理者アカウントを作成。氏名には日本語使用可能。「次へ」ボタンで確定すると、 こんにちは{}さん、はじめまして!
と表示されるが、v0.32.10では必ずこうなる模様。
「2. データを追加する」は「あとでデータを追加する」で飛ばす。
「3. データ使用の優先度」は、匿名情報の収集の同意なので適宜選択して「次へ」ボタンをクリック。
「Metabseを使い始める」ボタンをクリックすると、管理者アカウントに自動ログインし、アカウントのホームページに遷移する。
この時、DB設定に問題があると、ログインに失敗し、ログインページに遷移する。そうなると、何回ログインを試しても失敗する模様。MySQLの権限設定がおかしくて、データ追加が無駄になったりした...
初期設定
画面右上の設定(歯車アイコン) > 管理者より設定可能。
- 一般
- タイムゾーン
- 言語
- 選択しても反映されない?
- 以前のバージョンでは、「ビジュアライゼーション」が日本語だと桁落ちして、グラフの種類を選択できなかったりしたが、v0.32.10では改善されている模様
- わかりやすい表名とフィールド名
- 有効化すると、アンダースコアをスペースに変換して表示
- 「アンダースコアとダッシュをスペースに置き換える」が追加されていた、お好みで
- X-ray機能を有効化
- 以前は消せず、issueも上がっていたが、いつの間にか無効化できるようになった
- フォーマット中 (表記のまま), v0.33.2では「書式」に修正された
- 日付の形式, 時刻の形式, 通貨単位あたりを設定
- キャッシュ
とりあえず、この辺りをいじれば使えるようになる。
振り返り
Redashとの比較としては、導入はMetabaseのほうが楽。データベースの追加時、デフォルトでSSHポートフォワーディングの設定ができるのもありがたい。
データソースとして選択できる対象は、Redashが圧倒的に多い。Metabaseでも、データソース追加のissueはいろいろ挙がっているが、実装が追い付いていない模様。プラグインで追加したりできるんだろうか?
情報が少ないのもネック。クエリを書く時の変数の使い方とか、調べても今のところ公式ページくらいしか出てこない。
また、Redashではクエリの結果を組み合わせることができたが、Metabaseではまだできない。Dremioが勧められたりもしているが、未実装。
Metabaseの利用を前提として、情報集約用のデータベースを立てたりするならともかく、あちこちのデータソースに情報が散らばっている環境に導入するのであれば、まだまだRedashのほうが便利だと思う。