概要
データウェアハウスにおいて、データを整備する際に「あるテーブル」から「他方のテーブル」へ投入するSQLを用意し、バッチで運用するケースはしばしば見られます。このような仕組みを開発していく中で、互いのテーブルの関係性を設計し、ドキュメントとして整理しながら取り組めれば良いのですが、どうしてもビジネスニーズが先行し、ドキュメントが追いつかないケースも多々あるでしょう。このような状態を続けていくと、ソースにしかデータフローの仕様がなく、毎度毎度grepしてSQLの山からフローを読み解いていくことになります。
このように既存の仕組みから「データの流れを知りたい、管理したい」というニーズは高まってきており、DMBOKをはじめとする「データマネジメント」と呼ばれる管理体系に基づいた運用が期待されるようになってきました。本稿では、その中でも「データリネージ」に着目し、大量のSQLを解析して、テーブルのIN(SOURCE)とOUT(TARGET)の関係性をシンプルに可視化する方法を解説します。
課題
何かOSSで良い物がないかと探してみると、sqllineageという、SQL解析から可視化までオールインワンで対応しているツールが見つかりました。
早速試してみたところ、「階層関係が多すぎて可視化できない」問題にぶつかります。
ツールがハングして戻ってこないな...
その他にも、DBベンダー固有の処理で解析が止まったりと少しずつ課題が見えてきました。
- 全てを可視化しようとして破綻しているため、構造化と可視化のフェーズに分ける
- 確認したいテーブルを指定して、そこを起点に可視化する
- 可視化をシンプルにテキストベースで確認する
- DBベンダー固有処理をスキップできる汎用的な機能を用意する
上記の点を踏まえながら、sqllineageをベースに一つツールを開発してみることにしました。
datalineage-analyzer
仕組み
このツールはSQLファイルを探索し、データリネージを解析して、その構造を表示します。
ツールのアーキテクチャは以下の通りです。
- analyzerはSQLファイルを検索します。
- SQLファイルのベンダー固有の処理を変換します。ReplaceHandlerと呼ばれる汎用的に変換する仕組みを有しています。
- ツリー構造のデータ構造を生成し、ファイルに出力します(pickle形式)。
- visualizerを使用してツリー構造をテキスト形式で出力します。
データ(カラム)までは対応しておらず、一旦テーブルのみ対応しています
実行サンプル
sampleディレクトリからSQLファイルを探索して、pklファイルを生成します
python analyzer.py -i sample
テーブルの流れを解析した木構造を持つdata_lineage.pklを生成します。
確認したい対象のテーブルを指定し、そのテーブルの先(OUT/TARGET)となったテーブルのリストをテキストベースで表示します。
python visualizer.py -k target -t persons
output:
persons
├── city_stat
└── members
└── address_stat
確認したい対象のテーブルを指定し、そのテーブルの元(IN/SOURCE)となったテーブルのリストをテキストベースで表示します。
python visualizer.py -k source -t members
output:
members
├── address_of_member
└── persons
ソース一式
ソースコードとサンプルの一式をgithubに上げているので、よろしければ参照されてください。
今後の改善
コマンド+テキスト+ツリー形式、というかなり古典的な可視化方法でしたが、それなりの規模でも動作すると思われるので、課題感は達成できたと考えています。
有償ツールの導入は敷居が高いですし、無償ツールの活用でも予算を確保しての開発は難しいと思われたので、日曜大工の感覚で開発してみました。
今後は、より便利に使えるようにブラウザベースで出力できるようなUIを開発してみようかなと思っています。