dbt-athenaを使っているdbtプロジェクトでドキュメントを生成してみる

dbt-athena-communityプラグインを使ってAthenaをデータベースとした場合に、documentation機能を使ってほかのデータベースと同じようにドキュメントが見られることを確認してみました。
2023.09.10

データアナリティクス事業本部 機械学習チームの鈴木です。

機械学習モデル開発用のデータマート作成に、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を以下のように設定し、ハイライト箇所でポートフォワーディングの設定をします。

~/.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 80018001番ポートを指定してサーバーを起動し、そのポートにブラウザからアクセスしました。

サーバーへのアクセス例

モデルの作成

ドキュメントで確認する最低限の情報を作るため、前準備としてソースとモデルを定義し、Glueデータベースにモデルを作成しました。

今回はドキュメントでデータリネージも確認したかったため、以下の2パターンを確認できるようモデルを作成しました。

  • Sourcesでソーステーブルを定義し、sourceを使ってモデルで参照する
  • モデルの定義で、refを使ってほかのモデルを参照する

ソース・モデルの定義

それぞれは以下のように定義しました。

ソースの定義

1つのソーステーブルを定義しました。

models/iris.yml

version: 2

sources:
  - name: iris_raw
    database: awsdatacatalog 
    schema: cm-nayuts-sample-db
    tables:
      - name: iris

モデルの定義

2つのモデルを定義しました。

models/iris_avg.sql

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

models/iris_with_avg.sql

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. ドキュメントの確認(テーブル情報)

ドキュメントへアクセスできたので、内容を見ていきました。

まずはトップページです。ドキュメントの説明が書いてあることが分かります。また、左側にはProjectDatabaseGroupのタブがあります。

トップページ

Projectタブより見ていきます。sourceでは、models/iris.ymlで定義したiris_rawソースの情報が見られます。ソーステーブルは1つで、AWS Glueデータカタログのcm-nayuts-sample-dbデータベースに登録されていることが分かります。

ソーステーブルを開くと、以下のような画面になりました。

一通りのメタデータが確認できます。特にポイントに思ったのはReferenced Byで、そのソーステーブルを参照しているモデルが分かるところで、とても便利そうです。

ソーステーブルの画面例

次にモデルです。こちらも一通りのメタデータが確認できることに加え、Referenced ByDepends Onで依存関係が確認できます。後ほどデータリネージも確認しますが、テーブルとして確認できるのでリネージが大きい場合に便利そうです。

モデルの画面例

以下はDatabaseタブとGroupタブです。

databaseタブ

Groupタブ

また、ページ上部の検索窓をクリックすると、モデルの検索が可能です。モデル名だけではなく、カラムやSQL定義でも検索がかけられるので非常に便利です。

モデルの検索

4. ドキュメントの確認(データリネージ)

画面右下に映っているアイコンをクリックすると、データリネージを開くことができます。

データリネージを開く

今回はソーステーブル1つとモデルが2つの簡単な例ですが、下部からメタデータでフィルタすることができるようでした。

データリネージ画面例

ノードをクリックすることでそのノードの依存関係をハイライトしてくれました。

データリネージ画面例2

最後に

dbt-athena-communityプラグインを使ってAthenaをデータベースとした場合に、documentation機能を使ってほかのデータベースと同じようにドキュメントがみられることを確認してみました。

S3とAthenaを使ったデータレイクでも、dbtを使ってドキュメントやデータリネージが簡単に生成できるので非常に頼もしいです。

参考になりましたら幸いです。

参考