DockerでApache Supersetをセルフホストする:CSV出力から卒業し、データの可視化を始めよう

Database tutorial - IT technology blog
Database tutorial - IT technology blog

課題:年収15万ドルの「CSVエクスポート担当」エンジニア

データのサイロ化は、エンジニアの生産性を静かに蝕む要因です。多くのチームでは、データがPostgreSQLのプロダクションDB、ClickHouseのログ、MySQLのマーケティング用テーブルなどに分散しています。ステークホルダーが週次の成長レポートを必要とするたびに、開発者はスプリントを中断し、複雑なSQLの結合を書き、CSVをエクスポートしなければなりません。これが週に2回も起きれば、実質的に高度なスキルを持つエンジニアを、手動のデータ入力作業員として雇っているのと同じです。

障壁はデータの不足ではなく、アクセスのためのコストです。TableauやPowerBIのようなプロプライエタリなツールは、中規模チームで月額2,000ドル以上かかることも珍しくありません。さらに、これらのSaaSプラットフォームは、厳格なオンプレミスのセキュリティ要件への対応に苦慮することがよくあります。ReactやD3.jsでカスタムダッシュボードを構築するのも、解決策にはなりにくいでしょう。デプロイまでに数週間かかり、更新にはさらに時間がかかるというメンテナンスの負担が生じるからです。

そこでApache Supersetの登場です。これは、単純な円グラフから大規模な地理空間ヒートマップまで、あらゆるものを処理できるモダンでエンタープライズ向けのビジネスインテリジェンス(BI)プラットフォームです。Dockerを使用すれば、まっさらなターミナルから約5分で、完全に機能するBIスイートを構築できます。

クイックスタート:5分でSupersetをデプロイする

Supersetを実行する最も信頼性の高い方法は、公式のDocker Compose設定を使用することです。このセットアップにより、ウェブサーバー、メタデータ用データベース、Redisキャッシュレイヤー、およびCeleryバックグラウンドワーカーがオーケストレートされます。

1. リポジトリをクローンする

まずは、ソースコードの最新の安定版を取得します:

git clone --depth=1 https://github.com/apache/superset.git
cd superset

2. 環境の初期化

Supersetは、機密性の高い接続文字列を暗号化するためにSECRET_KEYを使用します。これを設定しないと、本番環境に近い設定ではコンテナの起動に失敗する可能性が高いです。安全な42文字の文字列を生成します:

openssl rand -base64 42

docker/.env-non-devを開き、生成したキーをSUPERSET_SECRET_KEYフィールドに貼り付けます。これにより、データベースの認証情報が保存時に暗号化された状態に保たれます。

3. Docker Composeで起動する

標準的なデプロイには、non-dev構成を使用します。このバージョンはパフォーマンスが最適化されており、フロントエンド開発ツールの重いオーバーヘッドが省かれています。

docker-compose -f docker-compose-non-dev.yml up -d

データベースのマイグレーションが完了するまで2〜3分待ちます。ログにサーバーの準備が整ったと表示されたら、http://localhost:8088にアクセスします。デフォルトの認証情報(admin / admin)でログインしてください。

内部構造:アーキテクチャについて

コマンドを実行すると、実際にはマイクロサービス群が起動します。以下の4つのコンポーネントを理解しておくことは、後のパフォーマンスの問題解決に役立ちます:

  • superset_app: UIを提供し、APIリクエストを処理する Flaskベースのエンジンです。
  • superset_db: 専用のPostgreSQLインスタンスです。ユーザーロールやダッシュボードのレイアウトなど、Supersetの内部データのみを保存します。ビジネスデータ自体は保存しません。
  • superset_cache (Redis): 短期記憶として機能します。Redisがないと、ダッシュボードを更新するたびにプロダクションDBへ新規クエリが強制され、不要な負荷がかかってしまいます。
  • superset_worker: 数百万行のデータを処理する場合でもUIを軽快に保つため、重いクエリをバックグラウンドで処理するCeleryワーカーです。

データへの接続

SupersetはSQLAlchemyを使用して、ほぼすべてのデータソースと通信します。最初のデータベースをリンクするには、Settings -> Database Connectionsに移動します。

データベースがDockerと同じホストで実行されている場合、コンテナには独自のネットワークがあるため、localhostは機能しません。代わりにhost.docker.internalを使用してください。Linuxでは、Composeファイルに--add-host=host.docker.internal:host-gatewayを追加する必要がある場合があります。

postgresql://user:[email protected]:5432/my_prod_db

インポート前の簡単なデータクリーニングには、toolcraft.app/ja/tools/data/csv-to-jsonをよく使います。ブラウザ内でローカルに処理されるため、外部の変換サイトにアップロードすべきではない機密性の高い個人情報(PII)を扱う際に非常に便利です。

スケーリング:ドライバの追加とセキュリティ

SupersetのベースイメージにはPostgreSQLとMySQLのドライバが含まれています。しかし、ClickHouse、Snowflake、BigQueryなどを使用する場合は、特定のPythonドライバをご自身で追加する必要があります。

このためにDockerイメージ全体を再ビルドする必要はありません。docker/requirements-local.txtという名前のファイルを作成し、ドライバを記述するだけです:

# ClickHouseとSnowflakeの例
clickhouse-connect
snowflake-sqlalchemy

コンテナを再起動します。Supersetの起動スクリプトが自動的にこのファイルを検出し、起動シーケンス中にパッケージをインストールします。

きめ細かな権限管理

Supersetの強力な機能の一つに、ロールベースアクセス制御(RBAC)があります。ユーザーにダッシュボードの閲覧は許可するがSQL Labは隠す、といった「閲覧専用」ロールを作成できます。これにより、非エンジニアのユーザーが誤って10億行のテーブルにSELECT *を実行し、クラウドの利用料を急騰させるのを防げます。

高速なダッシュボードのためのパフォーマンスチェックリスト

読み込みに30秒かかるダッシュボードを好む人はいません。チャートの動作が重いと感じる場合は、以下の3つの項目を確認してください:

  1. セマンティックレイヤー: 150列もある生のテーブルをユーザーに公開しないでください。「Datasets」ビューを使用してデータを整理しましょう。created_at_utc_unixSignup Dateにリネームしたり、Customer Lifetime Valueのような指標を事前に計算しておきます。
  2. 非同期クエリ: Celeryワーカーが動作していることを確認してください。10秒以上かかるクエリの場合、非同期実行によってブラウザのタイムアウトを防ぐことができます。
  3. 永続ボリューム: docker-compose.ymlにメタデータデータベース用のボリュームマウントが設定されているか必ず確認してください。ボリュームなしでsuperset_dbコンテナを削除すると、作成したすべてのダッシュボードとユーザーロールが失われます。
volumes:
  superset_home: /app/superset_home
  db_home: /var/lib/postgresql/data

DockerはSupersetのような複雑なツールを管理しやすくしてくれます。これをセットアップすることで、単にチャートを作るだけでなく、セルフサービスの文化を築くことができます。チームが自分たちで疑問を解決できるようになれば、Slackでの「このSQLを実行してくれますか?」というメッセージもようやくなくなるでしょう。

Share: