sqllineage を使って digdag のログから Treasure Data のクエリのリネージを作ってみた

2022-05-05·
Aki Ariga
Aki Ariga
· 3 min read
sqllineage で Treasure Workflow のリネージを出してみた例

データリネージとは、DBなどでどのデータがどこから来てどこに行った、という「来歴」とも呼ばれる情報です。

自分がこの言葉を知ったのは、前職でCloudera Navigatorという製品を扱ったときにこの機能が実装されていることを知りました。 引き継いだ複雑なSQLなどのワークフローを渡されたときに、どういう流れになっているのかを可視化できるのがとても魅力でした。

Cloudera Navigatorのlineage。 https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cn_lineage_generation.html より

そんなlineageですが、Pythonの sqllineage というパッケージで分析・可視化できることを知りました。

sqllineage は Pythonで実装されているSQLのlinegaeを解析する部分と、Reactで実装された可視化のウェブアプリケーション sqllineagejs で成り立っています。

実は去年ぐらいにちらほら使っている人がいたのは後から知りました。


これを使ってTreasure Dataのデータの流れの可視化をしてみたいと思ったのですが、TDではちょうどworkflowエンジンのdigdagのログに実行されたSQLが書かれているのに気づきました。

そこで、digdagのTDのSQLを実行する td>, td_ddl> オペレータからSQLを抽出・変換するコマンド、 digdaglog2sql を作り、可視化をしてみました。

詳しい使い方は、GitHubを見ていただければと思いますが、Python 3.7以上が入っている環境であれば、pipで簡単にインストールできます。

pip install --user digdaglog2sql

TDからダウンロードしてきたワークフローのログがあれば、そこからSQLを抽出して保存できます。

digdaglog2sql --input workflow-log.txt --output output.sql

また、ワークフローのSession IDを指定すれば、そこからSQLに変換した結果を保存できます。

export TD_API_KEY=1234XXX/YYYYYYYY
digdaglog2sql --session-id 12345 --site us --output output.sql

また、endpointオプションを使えば自前でホストしたdigdagからもSQLを取得できます。

digdaglog2sql --session-id 12345 --endpoint digdag.example.com --output output.sql

注意点としては、2022/05/05現在のPyPIにある sqllineage と その裏側で依存している sqlparse の最新バージョンでは、 Trino やHiveなどの一部の機能がうまくColumnレベルのlineageの解析ができません。

Note

2022/05/11 現在、sqllineageの Hive, Trino に関する問題は修正され 1.3.5 でリリースされました。 これに伴い、sqllineageをsourceからインストールする際に必要だったnodeも不要になりました。

2022/10/06 sqlparseの 0.4.3 もリリースされたので upstreamの修正はすべて反映されました。

今、Pull Requestを出しているところなので、これらがリリースされれば解決されると思います。

ひとまず、パッチを当てたbranchをGitHubに用意したので、 nodeをインストールした環境で 以下のようにインストールしてください。

pip install git+https://github.com/chezou/sqlparse.git@trino#egg=sqlparse==0.4.3.dev0
pip install sqllineage

sqllineageをインストールした後は、出力したSQLファイルを指定すれば、可視化できます。

$ sqllineage -g -f output.sql
 * SQLLineage Running on http://localhost:5000/?f=output.sql

ブラウザを開けば、このようなColumnレベルやテーブルレベルの lineage が作成でき、拡大縮小もしながら眺められます。

SQL lineageの例

ぜひ、試してみてください。