Apache AirflowのER図をSchemaSpyで自動生成するようにしてみた

Apache Airflowベースのシステムを扱っていて、Metastore(PostgreSQL)のデータ構造はどうなってたかな?と調べることがあったので、SchemaSpyでER図を自動生成するようにしてみました。
2019.06.11

こんにちは。
OSS大好きなshoitoです。

Apache Airflowベースのシステムを扱っていて、Metastore(PostgreSQL)のデータ構造はどうなってたかな? dagテーブル、dag_runテーブル、jobテーブルがあって...、ジョブのリトライ回数はどのカラムだっけ?
...(探索中)
task_instanceテーブルのtry_numberカラムかー。というように、データ抽出しようとしてデータがどこにあるのか探すのに苦労することがありました。

こういうときはER図が欲しくなるので、Apache AirflowベースのシステムでSchemaSpyを利用し、ER図を生成しています。

SchemaSpyとは

SchemaSpy ・ Database Documentation Built Easy.
http://schemaspy.org/

SchemaSpyは既存のデータベースに接続し、テーブル構造を解析し、ERを含むHTMLドキュメントを作成してくれるJava製のツールです。
データベースとの接続にはJDBCを利用し、メタデータを抽出しているので、JDBCドライバが提供されているDBであれば、解析対象にできるようです。
(PostgreSQLとMySQLでは検証済みです。)

Apache Airflow MetastoreのER図を生成してみる

担当しているプロジェクトの一つでは、ローカル開発環境にDocker Composeを使っていて、docker-compose.ymlに、SchemaSpyコンテナを取り入れてるのですが、ここでは puckel/docker-airflow への導入を例に紹介します。

puckel/docker-airflow ではApache Airflowを構成するWebserver, Scheduler, Worker, Metastore(PostgreSQL), Queue(Redis)など一式をコンテナ化してくれていて、 docker-compose コマンドでまとめて起動・停止が行えるので、ローカル開発環境を構築する際に参考にしていました。

まずはGitHubリポジトリからcloneして、 docker-compose-CeleryExecutor.yml を編集します。

git clone https://github.com/puckel/docker-airflow
cd docker-airflow
vi docker-compose-CeleryExecutor.yml

PostgreSQLのデータ永続化のためにpostgresコンテナの設定変更と、ER図作成のためにschemaspyコンテナの設定を追加します。

postgres:
        image: postgres:9.6
        environment:
            - POSTGRES_USER=airflow
            - POSTGRES_PASSWORD=airflow
            - POSTGRES_DB=airflow
            - PGDATA=/var/lib/postgresql/data/pgdata
        volumes:
            - ./pgdata:/var/lib/postgresql/data/pgdata

    schemaspy:
        image: schemaspy/schemaspy:6.0.0
        command: ["-t", "pgsql", "-host", "postgres:5432", "-u", "airflow", "-p", "airflow", "-db", "airflow", "-s", "public"]
        depends_on:
            - postgres
            - worker     # 最後に起動するようにdepends_onでworkerを指定
        volumes:
            - ./output/er:/output
docker-compose -f docker-compose-CeleryExecutor.yml up -d
docker-compose -f docker-compose-CeleryExecutor.yml restart schemaspy

初回起動時に、PostgreSQLの初期化とApache Airflowのマイグレーションによるテーブル作成が行われるので、 docker-compose restart schemaspy をして、再度PostgreSQLデータベースの再解析を実施しています。
2度目からはPostgreSQLコンテナの初期化の時間が短縮されるので、この手順は不要です。

schemaspy コンテナの volumes で指定したパスにHTMLファイルなど一式が生成されるので、ブラウザで確認します。

open output/er/index.html

合計で22テーブル、152カラムで構成されてることが分かります。
結構キレイなデザイン!?

ER図が作成されてることが分かりますが、リレーションの引かれてないテーブルもあり、完璧ではないようです。
しかし、テーブル構成を理解する助けには十分です。

さいごに

SchemaSpyの実行方法としては、今回紹介した方法以外に、SchemaSpy公式サイトで紹介されているように、 java -jar schemaspy.jar ... で実行してもかまいませんし、単体のコンテナとして docker コマンドで実行するやり方もあります。

本格的に運用するなら、テーブル数が増えてくると解析に時間がかかるようになりますし、メルペイのようにCIに組み込んで、SchemaSpyによって生成されたファイルを見られるようにpublishしておくのが良いと思います。