
dbt-athenaを使っているdbtプロジェクトでドキュメントを生成してみる
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
データアナリティクス事業本部 機械学習チームの鈴木です。
機械学習モデル開発用のデータマート作成に、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を使ってドキュメントやデータリネージが簡単に生成できるので非常に頼もしいです。
参考になりましたら幸いです。










