MetabaseをMySQLやPostgreSQLで動かす

データソースは現状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_mysqlMySQLの初回起動を行っておかないと、Metabaseの初期化開始前にMySQLが起動完了せず初期化に失敗する模様。

Ctrl + cMySQLを停止してから docker-compose downdocker-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/ を開き、「開始しましょう」ボタンをクリック。

f:id:hepokon365:20190826025211p:plain

「1. 何とお呼びしましょうか?」で管理者アカウントを作成。氏名には日本語使用可能。「次へ」ボタンで確定すると、 こんにちは{}さん、はじめまして! と表示されるが、v0.32.10では必ずこうなる模様。

f:id:hepokon365:20190826025720p:plain

「2. データを追加する」は「あとでデータを追加する」で飛ばす。

「3. データ使用の優先度」は、匿名情報の収集の同意なので適宜選択して「次へ」ボタンをクリック。

「Metabseを使い始める」ボタンをクリックすると、管理者アカウントに自動ログインし、アカウントのホームページに遷移する。

この時、DB設定に問題があると、ログインに失敗し、ログインページに遷移する。そうなると、何回ログインを試しても失敗する模様。MySQLの権限設定がおかしくて、データ追加が無駄になったりした...

初期設定

画面右上の設定(歯車アイコン) > 管理者より設定可能。

  • 一般
    • タイムゾーン
    • 言語
      • 選択しても反映されない?
      • 以前のバージョンでは、「ビジュアライゼーション」が日本語だと桁落ちして、グラフの種類を選択できなかったりしたが、v0.32.10では改善されている模様
    • わかりやすい表名とフィールド名
      • 有効化すると、アンダースコアをスペースに変換して表示
      • 「アンダースコアとダッシュをスペースに置き換える」が追加されていた、お好みで
    • X-ray機能を有効化
  • フォーマット中 (表記のまま), v0.33.2では「書式」に修正された
    • 日付の形式, 時刻の形式, 通貨単位あたりを設定
  • キャッシュ

とりあえず、この辺りをいじれば使えるようになる。

振り返り

Redashとの比較としては、導入はMetabaseのほうが楽。データベースの追加時、デフォルトでSSHポートフォワーディングの設定ができるのもありがたい。

データソースとして選択できる対象は、Redashが圧倒的に多い。Metabaseでも、データソース追加のissueはいろいろ挙がっているが、実装が追い付いていない模様。プラグインで追加したりできるんだろうか?

情報が少ないのもネック。クエリを書く時の変数の使い方とか、調べても今のところ公式ページくらいしか出てこない。

また、Redashではクエリの結果を組み合わせることができたが、MetabaseではまだできないDremioが勧められたりもしているが、未実装

Metabaseの利用を前提として、情報集約用のデータベースを立てたりするならともかく、あちこちのデータソースに情報が散らばっている環境に導入するのであれば、まだまだRedashのほうが便利だと思う。