Digdagからdbtを実行してAthenaにモデルを作成してみた

EC2上のDigdagワークフローから、同じくインスタンスにインストールしたdbtを実行して、Athenaにモデルを実行する例を考えてみました。
2023.09.11

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

機械学習モデル開発用のデータマート作成に、dbt-athenaを使いたく、どんな感じで使えそうか試行錯誤中です。

私はDigdagに長い間お世話になっているのですが、Digdagとdbt Coreを組み合わせて使う例がなかなかなかったのでどのようにできそうか試してみました。

環境構築

一つのEC2にdbt CoreとDigdagをまとめてインストールし、Digdagのワークフローからインスタンスのローカルでdbt runを実行する形としました。

dbt実行環境

以前公開した以下の記事の方法でEC2上にdbt-coreとdbt-athena-communityをインストールして検証しました。

dbtのバージョンは以下になります。

  • dbt Core:1.5.6
  • dbt-athena-community:1.5.1

Digdag環境

今回は上記のEC2で手動でAmazon Corretto 8とDigdagをインストールしました。

Amazon Corretto 8はAmazon Linux 2向けの以下のガイドを参考に、インスタンスにログインした後にdnfでインストールしました。

sudo dnf install java-1.8.0-amazon-corretto

DigdagはGetting startedの『2. Downloading the latest version』に従いました。

バージョンは0.10.5でした。

なお、後ほどDigdagサーバーを起動してUIから操作しますが、ブラウザからSession Manager越しにSSH接続ポートフォワーディングを使ってDigdagサーバーにアクセスしました。

インスタンス・サーバーへのアクセス

この方法については以下の記事にて、dbtで生成したドキュメントの公開とアクセスでも取り上げているのでご確認ください。

やってみる

1. dbtプロジェクトを作成する

今回はdbtプロジェクトの中身はなんでもよいので、dbtプロジェクトは以下を流用しました。

EC2にログインしてdbt init test_projecttest_projectという名前のdbtプロジェクトを作成したものになります。

なにかdbt runでモデル作成できるdbtプロジェクトが既に作ってあるんだなーと思ってください。

2. Digdagのプロジェクトを作成する

プロジェクト用のディレクトリを作成しました。

# プロジェクト用のディレクトリを作成する
mkdir digdag_work

# digdagのワークフローがあるディレクトリに移動する
cd digdag_work

以下のようにワークフローを作成しました。

digdag_work/sample_workflow1.dig

+dbt_run:
  sh>: dbt run --project-dir test_project --profiles-dir dbt_profiles

dbt runにオプションを2つ付けましたが、これは後ほどポイントとして紹介します。

次に、以下のようにシンボリックリンクを作成しました。

# digdagのワークフローがあるディレクトリに移動する
cd digdag_work

# シンボリックリンクを作成する
ln -s ../test_project/ .

続いて、Digdagワークフローで使うdbtのプロファイル(profiles.yml)を作成しました。

# プロファイル用のディレクトリを作成する
mkdir dbt_profiles

# digdagのワークフローがあるディレクトリに移動する
cd dbt_profiles

例えば以下のようにdigdag_work/dbt_profiles/profiles.ymlを作成しました。(特に作業用のS3バケット名クエリ結果保存用のS3バケット名は読み替えてください。)

digdag_work/dbt_profiles/profiles.yml

test_project:
  outputs:
    dev:
      database: awsdatacatalog
      region_name: ap-northeast-1
      s3_data_dir: s3://作業用のS3バケット名/dbt-athena
      s3_staging_dir: s3://クエリ結果保存用のS3バケット名/dbt-athena
      schema: cm-nayuts-sample-db
      threads: 1
      type: athena
      work_group: cm-nayuts-workgroup
  target: dev

最終的にdigdag_workディレクトリの配下は以下のようになります。

ls -l digdag_work
total 4
drwxr-xr-x. 2 ec2-user ec2-user 26 Sep 10 06:38 dbt_profiles
-rw-r--r--. 1 ec2-user ec2-user 81 Sep 10 06:39 sample_workflow1.dig
lrwxrwxrwx. 1 ec2-user ec2-user 16 Sep 10 06:21 test_project -> ../test_project/

ワークフローのポイントとしては、まず--project-dirがあります。デフォルトではdbtはカレントディレクトリのdbt_project.ymlを探しにいきますが、Digdagから実行する場合はできれば今回したようにDigdagプロジェクトのルートの1階層下にdbt_project.ymlを配置したいです。このために--project-dirdbt_project.ymlがある場所としてデフォルトではない場所を指定しました。

また、--profiles-dirprofiles.ymlがある場所になります。デフォルトではユーザーのホームディレクトリの.dbt/profiles.ymlを参照しますが、Digdagサーバーを実行したユーザーをいちいち意識したくなかったので--profiles-dirで使用するプロファイルを指定することとしました。今回はDigdagのディレクトリに入れてしまいましたが、シンボリックリンクを貼ってコピーできるのでdbtプロジェクトの方に作ってもいいかもしれません。

3. Digdagサーバーの起動とプロジェクトのpush

もう一つターミナルを開いてSSH接続するなどして、Digdagサーバーを起動します。

# サーバーを起動する
# digdag_testディレクトリはtest_project・digdag_work配下ではない別の場所にする
digdag server -o ./digdag_test -n 8001

元のターミナルで、Digdagサーバーにプロジェクトをpushしました。

# digdag_workプロジェクトに移動する
cd digdag_work

# プロジェクトをpushする
digdag push sample_project -e localhost:8001 --copy-outgoing-symlinks

UIから確認すると、以下のようにワークフローがデプロイされました。

デプロイされたワークフロー

ここでポイントは、digdag push--copy-outgoing-symlinksを指定することです。これによりdbtプロジェクトを再帰的にコピーしてプロジェクトにpushしました。

この機能については以下の記事に説明があります。

また、注意点として、dbt docs generateなどでdbtプロジェクトのtarget配下にファイルがあるとき、ディレクトリ内のファイルサイズが大きくプロジェクトにpushできないことがありました。この場合、削除することで解消しました。

今回はdbtプロジェクトを丸ごとシンボリックリンクとDigdagの仕組みを使ってDigdagプロジェクトにpushしましたが、不要なものは省いておいた方がいいかもしれません。

4. ワークフローを実行する

UIからワークフローのRunボタンを押して、ワークフローを実行しました。

ワークフローの実行

以下のように実行できました。

Digdag実行結果

Athenaのクエリ履歴を見ると、該当の時間に確かにクエリが実行されていました。

クエリ履歴

最後に

EC2上のDigdagワークフローから、同じくインスタンスにインストールしたdbtを実行して、Athenaにモデルを実行する例を考えてみました。

Digdagを運用していて、データ作成にdbtを使いたい方の参考になれば幸いです。

ほかに参考にした文献