grasys blog

Apache Superset をソースコードから起動してカスタマイズする方法

なぜ Apache Superset?

BI(ビジネスインテリジェンス)ツールを選定する時、いくつかの条件があると思います。
その中では「機能性」が用途に応えられるのかが選定条件の一つになると思います。
数多のBIツールから一つ一つ調査することになります。

最近の流行りだと
・Tableau ← 非常に優秀だが、ライセンス料金がそれなりにかかる
・Looker Studio ← 無料で機能性も充実だが、Google アカウントや Google Cloud との連携を前提とした使い方になることが多いなど。
・Kibana + Elastic Search ← 高速で機能性も充実だが、ドキュメントベースでリレーショナルの DB と違って、 ESQL の勉強などが必要
・その他、色々

幾つかのツールを使ってみて感じたのは、どのツールも必ず一長一短があります。

であれば、足りない機能を自分たちで実装できる BI ツールがいいのでは?
それが Apache Superset です。

superset のコードを改変し、ソースから起動する

Superset の良いところ、気になるところ

superset のコミュニティはかなり大きい

良いところ
・無料
・コミュニティが大きい
・Opensource なのでいくらでも改変できる
・エンジニアなら自由度が高い

気になるところ
・グラフの種類がわりと少ない
・グラフの Layer 機能がない
・改変はできるが Python と React の知識が必要
・Kibana + Elastic Search など高速設計エンジンに比べると遅い

上記の理由から、本記事では Superset をソースコードから起動する手順を整理して紹介します。公式ドキュメントにも開発手順はありますが、設定や構成が複雑だったりして、Docker に不慣れだと動作確認に悩む場面があると思います。そこで、本記事では実際に試した際につまずいたり補足が必要だと感じたポイントも含めて解説します。

Superset をソースコードから起動する

選定条件

インストールするために Git, Python (Backend), Npm (Frontend) とデータベースが必要です。
開発環境汚染を防止するため、docker を使います。

ソースコードを取得する

Superset のソースコードは Github で公開しています。
https://github.com/apache/superset

まずは github から clone してソースコードを取得します。

すると、superset のフォルダができますので、下記のコマンドで出来たフォルダに入ります。

そのままだと main ブランチの古いコードになるので、新しいバージョンに切り替えます。
今回は 6.0.0rc2 を使用します。テーマや細かい権限管理できるバージョンなのでおすすめです。(あくまでローカル開発・検証環境の構築を対象としています)

6.0.0rc2 を checkout した結果

カスタム Docker コンテナ作成

git から clone したディレクトリにも docker-compose.yml がありますが、不要な設定も多いため、
今回は使いません。

下記は docker-compose.yml です。
仮の設定が多いため、Production などでは使わないでください。

そして Dockerfile です。

上記の docker-compose.yml と Dockerfile を一緒に superset のルートディレクトリにおいてください。
既存の docker-compose.yml と Dockerfile があるので、上書きか、消してください。

次は docker compose でコンテナを作成します。


これで下準備のデータベースとソース開発用のコンテナができています。

Superset 用のデータベース作成

下記のコマンドで postgres-db のコンテナ内に入ります。

psql コマンドで postgresql に接続します。

Superset 用のデータベースを作成しておきます。

その後 exit を 2 回入力して postgresql、コンテナから出ます。

\l コマンドでデータベースが作成されたことを確認できます。

バックエンドサーバのセットアップ

バックエンドサーバ(Python)をセットアップします。
下記のコマンドで python3 を使いますが、システムによっては python だったりします。

まずは Python の Dependencies をインストールしますが、
今回は mysql ではなく、 postgresql を使いますので、 
requirements/development.txt をちょっと編集します。
452 行目のところに mysqlclient を消すか、コメントアウトします。

また、authlib==1.6.5 をつけることで各認証機能を有効できます。

次にコンテナ内で操作するため、 docker exec でコンテナ内に入ります。

コンテナ内のファイルがちゃんとマウントされているところの確認


また、python の仮想環境から作ることをおすすめします。下記のコマンドは python 仮想環境から作成します。

pip で python の必要ライブラリパッケージをインストールします。

pip でライブラリパッケージインストール完了

superset のコマンドが使えるようになるので、superset コマンドで db 作成します。

admin ユーザを作成します。

任意ですが、サンプルのデータ入れます。

superset を初期化します。

最後に、superset のバックエンドサーバを起動します。
下記の例はポート 8088 に起動します。

これでバックエンドサーバのセットアップは完了です。

ただ、フロントエンドサーバは今ないので、このまま localhost:8088 に接続すると、
404エラーになります。

フロントエンドサーバのセットアップ

フロントエンドサーバのソースコードは clone したレポジトリーの superset-frontend フォルダにあります。
バックエンドの terminal 起動したままで、別の terminal 開いてまたコンテナに入り直します。

フロントエンドサーバのフォルダに入ります。

フロントエンドサーバは React で、 node バージョン 20.18.1 以上と npm バージョン 10.8.1 以上が必要です。
node と npm のインストールは Dockerfile で既に行なっているので問題ありません。

初期ライブラリをインストールします。

フロントエンドサーバをビルドします。
初回ビルドなので、時間かかります。

これでフロントエンドも起動できるようになりましたので、下記のコマンドで起動します。

しばらくビルドしたら起動完了します。

コンフィグを編集する

Superset は Redis を通して WebSocket を使っているので、
今回は使わないため、コンフィグを編集して無効にします。

docker/pythonpath_dev/superset_config.py を開いて編集します。

バックエンドサーバを起動したままなので、 Hot Reload 機能でコンフィグが編集された時すぐに変更が反映します。

Superset を試す

Webブラウザを開いて http://localhost:8088/ に入ると下記の画面がでれば設定がうまくいってます。
superset fab create-admin で作った user/pass を入力すれば入ります。

ログイン画面が出ていれば設定に問題なくできました。

ログイン後の画面

Superset をカスタマイズしてみる

やっとソースコードから起動できましたので、利点であるコードの改変に試しましょう。

まずは簡単なものから紹介します。

フロントエンドのコードを変更してみる

Superset のフロントエンドのソースコードは root フォルダから superset-frontend フォルダーにあります。

今回は試しに「テーマを強制的に Dark Theme にする」のソース変更をしてみましょう。
superset-frontend/src/theme/ThemeController.ts の 147行あたりに下記のように編集します。

    // Initialize theme and mode
    this.currentMode = this.determineInitialMode();
    const initialTheme =
      this.getThemeForMode(ThemeMode.DARK) || this.defaultTheme;
      //this.getThemeForMode(this.currentMode) || this.defaultTheme;

this.currentMode → ThemeMode.DARK に変更することで、システム設定関係なく強制的に Dark Mode にすることができます。

変更が自動的に反映されます。

コード編集すると自動でコンパイルしてくれます

ブラウザを更新するとテーマが Dark Mode に変更されたことが確認できます。

Dark Mode に変更されました

Superset グラフの種類を増やしてみる

Superset のグラフの種類は他の有名 BI ツールと比べると少なく、
増やしたい気持ちが強いです。
本来は使用目的に伴って色々コード改変、もしくは作成しますが、
今回は単純に増やすことをしてみます。

Superset のグラフのソースコードは superset-frontend/plugins フォルダにあります。

今回は下記の画像の Histogramと同じものを増やしてみます。
上のメニュの Charts → +New Chart でこのメニューをアクセスできます。

Histogram を複製します

scope-frontend/plugins/plugin-chart-echarts/Histogram
のフォルダを同じ階層で複製して、 フォルダ名を Histogram_New にします。

superset-frontend/plugins/plugin-chart-echarts/src/Histogram_New/index.ts
を編集します。
30行目の EchartsHistogramChartPlugin を EchartsHistogramNewChartPlugin にします。

// TODO: Implement cross filtering
// export default class EchartsHistogramChartPlugin extends ChartPlugin<
export default class EchartsHistogramNewChartPlugin extends ChartPlugin<
  HistogramFormData,
  HistogramChartProps
> {

新しいグラフクラスができているので、index に追加します。
superset-frontend/plugins/plugin-chart-echarts/src/index.ts の31行あたりに追加します。

export { default as EchartsGraphChartPlugin } from './Graph';
export { default as EchartsGaugeChartPlugin } from './Gauge';
export { default as EchartsHistogramChartPlugin } from './Histogram';
// HistogramNew を追加
export { default as EchartsHistogramNewChartPlugin } from './Histogram_New';
export { default as EchartsRadarChartPlugin } from './Radar';
export { default as EchartsFunnelChartPlugin } from './Funnel';

superset-frontend/packages/superset-ui-core/src/chart/types/VizType.ts の 39行目あたりに新しいタイプを増やす

Handlebars = 'handlebars',
Heatmap = 'heatmap_v2',
Histogram = 'histogram_v2',
HistogramNew = 'histogram_New', // 追加
Horizon = 'horizon',
LegacyBubble = 'bubble',

最後に superset-frontend/src/visualizations/presets/MainPreset.js で 169行目あたりに新しいグラフを追加します。

new EchartsHeatmapChartPlugin().configure({ key: VizType.Heatmap }),
new EchartsHistogramChartPlugin().configure({ key: VizType.Histogram }),

//追加
new EchartsHistogramNewChartPlugin().configure({ key: VizType.HistogramNew }), 
new SelectFilterPlugin().configure({ key: FilterPlugins.Select }),

上記の編集が終わったらもう一度グラフのリスト画面に入ると追加したグラフが増えていることを確認できます。

Histogram New が増えました

最後に

今回は時間の都合でフロントエンドの簡単な改変しか紹介できませんでしたが、
また時間ができたらバックエンドの機能改変方法や、全く新しいグラフ作製方法なども紹介したいと思います。

では、また次回に!


採用情報
お問い合わせ