dbt test が実行途中で止まってしまったら

2024-03-19

はじめに

チキン南蛮エンジニアの dach です。

dbt test は、データパイプラインの品質を保証するために欠かせないツールです。しかし、利用ケースが増えるとテストケースも増大するため、実行時間が長くなり、開発の効率を阻害してしまうことがあります。 dbt では threads を利用することでこの問題を解決します。同時に処理する DAG におけるパス数が増えるためです。しかし、並列実行数が増え、API へのリクエストが増えると DWH 製品の API 制限を超過することがあります。そのため、安定した実行をできるようにするために API 利用制限に抵触しないための対策が必要です。

今回の記事では、dbt を利用する際に API 利用制限を守るために必要な設定について紹介します。 なお、今回利用する API は BigQuery API を想定しています。

API 利用制限を超えると dbt test が実行途中で止まる

BQ API のリクエスト制限1に引っかかると、dbt test 実行中に返答がなくなります。

$ poetry run dbt test \
          --profiles-dir . \
          --project-dir .

08:22:30  184 of 189 PASS relationships_hoge_id__id__ref_raw_hoge_  [PASS in 2.38s]
08:22:34  189 of 189 PASS unique_hoge_id ................... [PASS in 4.49s]


# (返答なし)

リクエスト制限に引っかかった時の対策

サポートまたは営業に連絡して BigQuery の割り当ての増加をリクエストすることも可能ですが、まずは dbt のチューニングで問題の解決を試みましょう。 上記問題が発生した場合、dbt 上では以下の対策が必要です。

  1. 設定されている thread 数を見直す
    dbt test コマンドによって全モデルをテストするケースがある場合、 profiles.yml 内の threads の設定値を減らします。これにより、オプションつけ忘れによる再発が防止されます。また、dbt 実行時のオプションとして --threads を付与することもできます。オプションを渡した場合、オプションで指定した値が優先されます。

  2. 実行するテストを限定する
    dbt test 実行時に --select--exclude オプションを使用すると、実行するテストを絞り込めます。これにより、すべてのテストを実行するのではなく、必要なテストのみを実行することでリクエスト数を減らすことができます。また、model や layer に tag を設定していれば、tag:hoge のようにオプション指定することでモデルを個別に指定するよりも柔軟にテストすることができます。

  3. 不要なテストを削除する
    作成したテストは本当にすべてが必要かどうかを確認します。例えば、変更がないカラムに対して同じテストを実施しているなどは、削除できます。

まとめ

dbt test 実行中に問題が発生した場合は、上記の対策を参考にして解決してください。また、問題発生を未然に防ぐために、定期的なテストケースの最適化も検討することをおすすめします。

Data Platform チームでは、スピーディーに高品質なデータを提供できるようにするメンバーを更に募集中です。興味を持ってい頂けた方は是非以下もご覧頂ければ幸いです

参考文献

  1. BigQuery: Quotas and limits
  2. BigQuery: デフォルト構成を管理する
  3. BigQuery: Troubleshoot quota and limit errors
  4. dbt: BigQuery setup
  5. dbt: Using threads

Footnotes

  1. メソッド、ユーザーごとの 1 秒あたりの API リクエストの最大数は「100 リクエスト」である