Apache Supersetのバックアップとコンフィグ設定をしてみた

2021.02.12

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日「Apache Superset」のSnowflakeへの接続を試しました。

このときに、データセットやチャートを追加したのですが、これらのデータがこのままだとバックアップできないことに気づきました。今回は、Dockerコンテナの作り直しやミスでデータが失われないように、バックアップをできるようにしたいと思います。

また、サンプルデータのダッシュボードを触っているときに地図がうまく表示できていないことにも気付いたので、こちらも併せて対応したいと思います。

前提

環境は以下で試しています。

  • OS
    • macOS Catalina
  • Docker Desktop
    • 2.3.0.3

また、下記エントリで一通りのSupersetのセットアップは実施済みです。

調査

まずは、必要な情報を集めてみました。ポイントは以下です。

  • Supersetのデータはどこにあるのか?
  • 地図が表示できていない理由はなにか?

Supersetのデータはどこにあるのか?

まず、バックアップすべきデータがどこにあるのかですが、こちらの記事に記載があるようにデフォルトでは、データはSQLLiteのファイルとして~/.superset/superset.dbに保存されているようです。

一方で、2021/02/12現在、Docker Hubで公開されているコンテナapache/incubator-supersetの場合、ちょっとパスが異なり/app/superset_home/superset.dbに保存されていました。デフォルト設定の場合、このファイルをバックアップしておけばよさそうです。

また、SupersetはSQLAlchemyを利用しているので、superset_config.pySQLALCHEMY_DATABASE_URIを上書き指定してあげれば、保存先のパスを変えたり、接続先をPostgreSQLに変更したりすることもできそうです。

地図が表示できていない理由はなにか?

サンプルのダッシュボード「deck.gl Demo」ですが、特に設定をしていないと以下のようになっています。

Supersetでは地図のベースマップとして、Mapboxを利用していますが、NO_TOKEN_WARNINGと出ているとおり、Mapboxのトークン設定ができていないので、このような表示となっています。

公式ドキュメントのFAQにもある通り、設定をするためには、superset_config.pyMAPBOX_API_KEYを設定すれば良さそうです。

Why is the map not visible in the geospatial visualization?

You need to register a free account at Mapbox.com, obtain an API key, and add it to superset_config.py at the key MAPBOX_API_KEY:

MAPBOX_API_KEY = "longstringofalphanumer1c"

superset_config.py はどこにあるのか?

ということで、今度はsuperset_config.pyがどこにあるのかなのですが、デフォルトではこのファイルは存在していません。下記のドキュメントに記載の通り、PYTHONPATHに自分で作成する必要があります。

Docker Hubで公開されているコンテナapache/incubator-supersetの場合、PYTHONPATH/app/pythonpathに設定されていたので、ここに作成すれば良さそうです。

docker-compose.yml を修正する

ここまでで、必要な情報は集まったので対応していきます。バックアップと設定ファイルの作成にはDockerコンテナ内のディレクトリをバインドマウントしておくと良さそうなので、以下のようにvolumesの設定を追加します。

docker-compose.yml

version: "3.7"

services:
  superset:
    build:
      context: ./build/superset
      args:
        SUPERSET_ADMIN_USERNAME: $SUPERSET_ADMIN_USERNAME
        SUPERSET_ADMIN_FIRSTNAME: $SUPERSET_ADMIN_FIRSTNAME
        SUPERSET_ADMIN_LASTNAME: $SUPERSET_ADMIN_LASTNAME
        SUPERSET_ADMIN_EMAIL: $SUPERSET_ADMIN_EMAIL
        SUPERSET_ADMIN_PASSWORD: $SUPERSET_ADMIN_PASSWORD
    ports:
      - "8080:8080"
    volumes:
      - type: bind
        source: ./data/superset_home
        target: /app/superset_home
      - type: bind
        source: ./data/pythonpath
        target: /app/pythonpath

また、バインドマウントできるように事前にディレクトリを作成し、以下のようにディレクトリ構成を修正しておきます。

superset
┣ build
┃ ┗ superset
┃   ┣ Dockerfile
┃   ┗ requirements.txt
┣ data
┃ ┣ superset_home
┃ ┗ pythonpath
┣ .env
┗ docker-compose.yml

この状態で、docker-compose up -dとすれば、うまくマウントできるかと思います。

バックアップしてみる

この状態でコンテナを起動すると、data/superset_home/superset.dbが見えるようになります。このファイルをバックアップしておけば良いですね。

今回は試しにコンテナ内に入ってみて、ファイルをリネームしてバックアップし、データをすべて初期化してみます。

$ cp /app/superset_home/superset.db /app/superset_home/superset.db.20210212
$ rm /app/superset_home/superset.db
$ superset fab create-admin --username admin --firstname Superset --lastname Admin --email admin@superset.com --password admin
$ superset db upgrade
$ superset init

すっかり空っぽになりました。

では、バックアップファイルから戻してみましょう。

$ cp /app/superset_home/superset.db.20210212 /app/superset_home/superset.db

無事に戻ってきました!良さそうですね。今回はコンテナ内でバックアップ(cp)をしましたが、バインドマウントしているので、通常はホスト側でバックアップすれば問題ありません。

ベース地図を表示させてみる

Dockerのホスト側で以下のようにsuperset_config.pyファイルを作成し、MAPBOX_API_KEYを設定します。キーはドキュメントに記載があった通り、Mapboxでフリーアカウントを作成して取得したキーを利用します。

data/pythonpath/superset_config.py

MAPBOX_API_KEY="pk.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

このように設定したsuperset_config.pyを配置した状態でSupersetを起動すると、以下のように地図が表示されます。

やはりベース地図が表示されていると、とても良い感じになりますね!

まとめ

以上、Apache Supersetのバックアップとコンフィグ設定をしてみました。データのバックアップ方法も分かり、環境設定ファイルの作成もできたので、これで心置きなく色々設定ができそうです。データは定期的にバックアップするようにスクリプトで設定してもよさそうですね。

どなたかのお役に立てば幸いです。それでは!