dbt-athenaを使っているdbtプロジェクトでドキュメントを生成してみる
データアナリティクス事業本部 機械学習チームの鈴木です。
機械学習モデル開発用のデータマート作成に、dbt-athenaを使いたく、どんな感じで使えそうか試行錯誤中です。
dbtではdocumentation機能を使うことで、ドキュメントを生成することができます。dbt-athenaを使っている場合にどのようなドキュメントが生成できるものなのか確認してみました。
環境構築
インスタンスの作成
以前公開した以下の記事の方法でEC2上にdbt-coreとdbt-athena-communityをインストールして検証しました。
dbtのバージョンは以下になります。
- dbt Core:1.5.6
- dbt-athena-community:1.5.1
dbt docs generate
で生成したドキュメントは、dbt docs serve
コマンドでブラウザから確認できます。
インスタンスで公開したドキュメントへのアクセス
今回はAWS上にEC2インスタンスを立てて検証しており、ローカルのブラウザからSSHポートフォワーディングを使って、ローカルのブラウザからインスタンスで公開しているドキュメントにアクセスしました。
SSHは『EC2でAnsible練習環境を作成してみた』に記載しているようにSession Manager経由で行いました。
例えば~/.ssh/config
を以下のように設定し、ハイライト箇所でポートフォワーディングの設定をします。
host cm-nayuts-dbt-athena ProxyCommand sh -c "aws ssm start-session --target インスタンスID --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile 使用するプロファイル --region ap-northeast-1" User ec2-user IdentityFile 秘密鍵のパス LocalForward 8001 localhost:8001
この設定を使ってssh cm-nayuts-dbt-athena
を実行してインスタンスにSSH接続することで、ローカルのブラウザからインスタンスの8001
ポートにアクセスしました。
後ほど説明するように、dbt docs serve
コマンドでポート指定できるため、例えばインスタンス側でdbt docs serve --port 8001
で8001
番ポートを指定してサーバーを起動し、そのポートにブラウザからアクセスしました。
モデルの作成
ドキュメントで確認する最低限の情報を作るため、前準備としてソースとモデルを定義し、Glueデータベースにモデルを作成しました。
今回はドキュメントでデータリネージも確認したかったため、以下の2パターンを確認できるようモデルを作成しました。
Sources
でソーステーブルを定義し、source
を使ってモデルで参照する- モデルの定義で、
ref
を使ってほかのモデルを参照する
ソース・モデルの定義
それぞれは以下のように定義しました。
ソースの定義
1つのソーステーブルを定義しました。
version: 2 sources: - name: iris_raw database: awsdatacatalog schema: cm-nayuts-sample-db tables: - name: iris
モデルの定義
2つのモデルを定義しました。
select class, avg(sepal_length) as avg_sepal_length, avg(sepal_width) as avg_sepal_width, avg(petal_length) as avg_petal_length, avg(petal_width) as avg_petal_width from {{ source('iris_raw','iris') }} group by class
select iris_raw.class, iris_raw.sepal_length, iris_raw.sepal_width, iris_raw.petal_length, iris_raw.petal_width, iris_avg.avg_sepal_length, iris_avg.avg_sepal_width, iris_avg.avg_petal_length, iris_avg.avg_petal_width from {{ source('iris_raw','iris') }} as iris_raw join {{ref('iris_avg')}} as iris_avg on iris_raw.class = iris_avg.class
モデルの実行
dbt run
でモデルを実行しました。
# あらかじめdbt init test_projectでプロジェクトを作成していますが、 # この記事で説明したい内容ではないので省略します。 cd test_project # モデルの実行 dbt run
以下のようにGlueデータベース上にテーブルが作成されました。
ドキュメントの確認
1. ドキュメントの生成
dbt docs generate
コマンドで、dbtプロジェクトのドキュメントを生成しました。
cd test_project # ドキュメントの生成 dbt docs generate
03:48:53 Running with dbt=1.5.6 03:48:53 Registered adapter: athena=1.5.1 03:48:53 Found 2 models, 0 tests, 0 snapshots, 0 analyses, 336 macros, 0 operations, 0 seed files, 1 source, 0 exposures, 0 metrics, 0 groups 03:48:53 03:48:54 Concurrency: 1 threads (target='dev') 03:48:54 03:48:54 Building catalog 03:48:55 Catalog written to /home/ec2-user/test_project/target/catalog.json
2. ドキュメントの公開
dbt docs serve
コマンドでサーバーを起動して、ドキュメントを公開しました。環境構築に記載したように、--port 8001
で8001番ポートを指定しました。
cd test_project # ドキュメントの公開 dbt docs serve --port 8001
04:23:39 Running with dbt=1.5.6 Serving docs at 8001 To access from your browser, navigate to: http://localhost:8001 Press Ctrl+C to exit.
この状態で、ローカルPCのブラウザから、SSHポートフォワーディングでインスタンスの8001番ポートへアクセスしました。
3. ドキュメントの確認(テーブル情報)
ドキュメントへアクセスできたので、内容を見ていきました。
まずはトップページです。ドキュメントの説明が書いてあることが分かります。また、左側にはProject
・Database
・Group
のタブがあります。
Project
タブより見ていきます。sourceでは、models/iris.yml
で定義したiris_raw
ソースの情報が見られます。ソーステーブルは1つで、AWS Glueデータカタログのcm-nayuts-sample-db
データベースに登録されていることが分かります。
ソーステーブルを開くと、以下のような画面になりました。
一通りのメタデータが確認できます。特にポイントに思ったのはReferenced By
で、そのソーステーブルを参照しているモデルが分かるところで、とても便利そうです。
次にモデルです。こちらも一通りのメタデータが確認できることに加え、Referenced By
とDepends On
で依存関係が確認できます。後ほどデータリネージも確認しますが、テーブルとして確認できるのでリネージが大きい場合に便利そうです。
以下はDatabase
タブとGroup
タブです。
また、ページ上部の検索窓をクリックすると、モデルの検索が可能です。モデル名だけではなく、カラムやSQL定義でも検索がかけられるので非常に便利です。
4. ドキュメントの確認(データリネージ)
画面右下に映っているアイコンをクリックすると、データリネージを開くことができます。
今回はソーステーブル1つとモデルが2つの簡単な例ですが、下部からメタデータでフィルタすることができるようでした。
ノードをクリックすることでそのノードの依存関係をハイライトしてくれました。
最後に
dbt-athena-communityプラグインを使ってAthenaをデータベースとした場合に、documentation機能を使ってほかのデータベースと同じようにドキュメントがみられることを確認してみました。
S3とAthenaを使ったデータレイクでも、dbtを使ってドキュメントやデータリネージが簡単に生成できるので非常に頼もしいです。
参考になりましたら幸いです。