Digdagからdbtを実行してAthenaにモデルを作成してみた
データアナリティクス事業本部 機械学習チームの鈴木です。
機械学習モデル開発用のデータマート作成に、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_project
でtest_project
という名前のdbtプロジェクトを作成したものになります。
なにかdbt run
でモデル作成できるdbtプロジェクトが既に作ってあるんだなーと思ってください。
2. Digdagのプロジェクトを作成する
プロジェクト用のディレクトリを作成しました。
# プロジェクト用のディレクトリを作成する mkdir digdag_work # digdagのワークフローがあるディレクトリに移動する cd digdag_work
以下のようにワークフローを作成しました。
+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バケット名
は読み替えてください。)
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-dir
でdbt_project.yml
がある場所としてデフォルトではない場所を指定しました。
また、--profiles-dir
はprofiles.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
ボタンを押して、ワークフローを実行しました。
以下のように実行できました。
Athenaのクエリ履歴を見ると、該当の時間に確かにクエリが実行されていました。
最後に
EC2上のDigdagワークフローから、同じくインスタンスにインストールしたdbtを実行して、Athenaにモデルを実行する例を考えてみました。
Digdagを運用していて、データ作成にdbtを使いたい方の参考になれば幸いです。