Databricks ジョブ での dbt 変換の使用

dbt コア プロジェクトは、Databricks ジョブのタスクとして実行できます。 dbt Core プロジェクトをジョブ タスクとして実行することで、次の Databricks ジョブ機能を利用できます。

  • dbt タスクを自動化し、dbt タスクを含むワークフローをスケジュールします。

  • dbt 変換を監視し、変換の状態に関する通知を送信します。

  • dbt プロジェクトを他のタスクと共にワークフローに含めます。 たとえば、ワークフローでは、 Auto Loaderを使用してデータを取り込み、dbt を使用してデータを変換し、ノートブック タスクを使用してデータを分析できます。

  • ジョブ実行からの成果物 (ログ、結果、マニフェスト、構成など) の自動アーカイブ。

dbt Core の詳細については、 dbt のドキュメントを参照してください。

開発・本番運用ワークフロー

Databricks では、Databricks SQL ウェアハウスに対して dbt プロジェクトを開発することをお勧めします。 Databricks SQL ウェアハウスを使用すると、dbt によって生成された SQL をテストし、SQL ウェアハウスのクエリ履歴を使用して dbt によって生成されたクエリをデバッグできます。

本番運用で 変換を実行するには、dbtDatabricks でdbt タスクを使用することをお勧めします。Databricksデフォルトでは、dbt タスクはdbtPython Databricksコンピュートを使用して プロセスを実行し、選択されたdbt SQLSQL ウェアハウスに対して によって生成された を実行します。

dbt変換は、サーバーレス SQL サーバーまたはプロフェッショナル SQL サーバー、 Databricksコンピュート、またはその他のdbt対応サーバー上で実行できます。 この記事では、最初の 2 つのオプションについて例を挙げて説明します。

ワークスペースで Unity Catalog が有効になっていて、サーバレス ワークフローが有効になっている場合は、デフォルトで、ジョブはサーバレス コンピュート上で実行されます。

SQL データベースに対してdbtモデルを開発し、それをDatabricksの実際の運用で実行すると、パフォーマンスとSQL言語のサポートに微妙な違いが生じる可能性があります。 Databricks 、コンピュートおよび SQL ウェアハウスに同じDatabricks Runtimeバージョンを使用することを推奨しています。

要件

  • dbt Core と dbt-databricks パッケージを使用して、開発環境で dbt プロジェクトを作成および実行する方法については、「 dbt Core への接続」を参照してください。

    Databricks では、dbt-spark パッケージではなく、 dbt-databricks パッケージをお勧めします。 dbt-databricks パッケージは、Databricks 用に最適化された dbt-spark のフォークです。

  • Databricks ジョブで dbt プロジェクトを使用するには、 Databricks Git フォルダーとの Git 統合をセットアップする必要があります。 DBFS から dbt プロジェクトを実行することはできません。

  • Databricks SQL 資格を持っている必要があります。

最初の dbt ジョブ を作成して実行する

次の例では、dbt のコア概念を示すサンプル プロジェクトである jaffle_shop プロジェクトを使用します。 ジャッフルショッププロジェクトを実行するジョブを作成するには、次の手順に従います。

  1. Databricks ランディングページに移動し、次のいずれかの操作を行います。

    • ジョブアイコン サイドバー の 「ワークフロー 」をクリック [ジョブの作成] ボタンし 、 をクリックします。

    • サイドバーで、[新しいアイコン 新規 ] をクリックし 、[ジョブ] を選択します。

  2. [タスク] タブの [タスク]テキスト ボックスで、[ジョブの名前を追加…]をジョブ名に置き換えます。

  3. [ タスク名] に、タスクの名前を入力します。

  4. [ タイプ] で、 dbt タスク・タイプを選択します。

    dbt タスクを追加する
  5. [ソース] ドロップダウン メニューで、ワークスペースを選択して、Databricks ワークスペース フォルダーにある dbt プロジェクトを使用するか、リモート Git リポジトリにあるプロジェクトのGit プロバイダーを使用できます。 この例では、Git リポジトリにある jaffle shop プロジェクトを使用しているため、 [Git プロバイダー]を選択し、 [編集]をクリックして、jaffle shop GitHub リポジトリの詳細を入力します。

    dbt プロジェクト リポジトリを構成する
    • [Git リポジトリの URL] に、ジャッフル ショップ プロジェクトの URL を入力します。

    • Git リファレンス (ブランチ/タグ/コミット)mainと入力します。タグまたは SHA を使用することもできます。

  6. [確認]をクリックします。

  7. dbt コマンド テキスト ボックスで、実行する dbt コマンド (depsseed、および 実行) を指定します。 すべてのコマンドの前に dbtを付ける必要があります。 コマンドは、指定された順序で実行されます。

    dbt コマンドの設定
  8. [SQLウェアハウス] で、dbt によって生成された SQL を実行する SQL ウェアハウスを選択します。[SQLウェアハウス] ドロップダウン メニューには、サーバレスと pro SQLウェアハウスのみが表示されます。

  9. (オプション)タスク出力のスキーマを指定できます。 デフォルトにより、スキーマ default が使用されます。

  10. (オプション) dbt Coreを実行するコンピュート構成を変更する場合は、 dbt CLIコンピュートをクリックします。

  11. (オプション)タスクの dbt-databricks バージョンを指定できます。 たとえば、開発および運用用に dbt タスクを特定のバージョンにピン留めするには、次のようにします。

    • [依存ライブラリ] で、現在の dbt-databricks バージョンの横にあるクリックを行います 削除アイコン

    • [追加] をクリックします。

    • [依存ライブラリの追加]ダイアログで、 [PyPI]を選択し、 [パッケージ] テキスト ボックスに dbt パッケージのバージョンを入力します (例: dbt-databricks==1.6.0 )。

    • [追加] をクリックします。

    dbt-databricks バージョンの設定

    Databricks では、dbt タスクを特定のバージョンの dbt-databricks パッケージにピン留めして、開発と本番運用の実行に同じバージョンが使用されるようにすることをお勧めします。 Databricks では、バージョン 1.6.0 以降の dbt-databricks パッケージを推奨しています。

  12. [作成]をクリックします。

  13. ジョブを今すぐ実行するには、 [今すぐ実行] ボタンをクリックします。

dbt ジョブタスク の結果を表示する

ジョブが完了したら、 ノートブック から SQL クエリを実行するか、Databricks ウェアハウスで クエリ を実行して、結果をテストできます。 たとえば、次のサンプル クエリを参照してください。

 SHOW tables IN <schema>;
SELECT * from <schema>.customers LIMIT 10;

<schema> をタスク設定で設定されたスキーマ名に置き換えます。

API の例

ジョブ API を使用して、dbt タスクを含むジョブを作成および管理することもできます。次の例では、単一の dbt タスクを持つジョブを作成します。

{
  "name": "jaffle_shop dbt job",
  "max_concurrent_runs": 1,
  "git_source": {
    "git_url": "https://github.com/dbt-labs/jaffle_shop",
    "git_provider": "gitHub",
    "git_branch": "main"
  },
  "job_clusters": [
    {
      "job_cluster_key": "dbt_CLI",
      "new_cluster": {
        "spark_version": "10.4.x-photon-scala2.12",
        "node_type_id": "i3.xlarge",
        "num_workers": 0,
        "spark_conf": {
          "spark.master": "local[*, 4]",
          "spark.databricks.cluster.profile": "singleNode"
        },
        "custom_tags": {
          "ResourceClass": "SingleNode"
        }
      }
    }
  ],
  "tasks": [
    {
      "task_key": "transform",
      "job_cluster_key": "dbt_CLI",
      "dbt_task": {
        "commands": [
          "dbt deps",
          "dbt seed",
          "dbt run"
        ],
        "warehouse_id": "1a234b567c8de912"
      },
      "libraries": [
        {
          "pypi": {
            "package": "dbt-databricks>=1.0.0,<2.0.0"
          }
        }
      ]
    }
  ]
}

(上級)カスタムプロファイル を使用したdbtの実行

SQL ウェアハウス (推奨) または汎用コンピュートを使用してdbtタスクを実行するには、接続先のウェアハウスまたはDatabricksコンピュートを定義するカスタム profiles.yml を使用します。 ウェアハウスまたは汎用コンピュートを使用してジャッフルショップ プロジェクトを実行するジョブを作成するには、次の手順を実行します。

dbtタスクのターゲットとして使用できるのは、SQL ウェアハウスまたは汎用コンピュートのみです。 ジョブ コンピュート をdbtのターゲットとして使用することはできません。

  1. jaffle_shop リポジトリのフォークを作成します。

  2. フォークされたリポジトリをデスクトップにクローンします。 たとえば、次のようなコマンドを実行できます。

    git clone https://github.com/<username>/jaffle_shop.git
    

    <username> を GitHub ハンドルに置き換えます。

  3. jaffle_shop ディレクトリに次の内容の profiles.yml という名前の新しいファイルを作成します。

     jaffle_shop:
       target: databricks_job
       outputs:
         databricks_job:
          type: databricks
          method: http
          schema: "<schema>"
          host: "<http-host>"
          http_path: "<http-path>"
          token: "{{ env_var('DBT_ACCESS_TOKEN') }}"
    
    • <schema> をプロジェクト テーブルのスキーマ名に置き換えます。

    • dbtSQL ウェアハウスで タスクを実行するには、 を<http-host> SQL ウェアハウスの [接続の詳細] タブの Server ホスト名の 値に置き換えます。dbt汎用コンピュートを使用して タスクを実行するには、<http-host> を、JDBC のODBC [詳細オプション]、 / タブの Server ホスト名のDatabricks 値に置き換えます。

    • dbtSQL ウェアハウスで タスクを実行するには、 を<http-path> SQL ウェアハウスの [接続の詳細] タブの HTTP パス 値に置き換えます。dbt汎用コンピュートを使用して タスクを実行するには、<http-path> を、JDBC のODBC [詳細オプション]、 / タブの HTTP パスDatabricks 値に置き換えます。

    このファイルはソース管理にチェックインするため、ファイル内に「アクセスウイルス」などのシークレットを指定しません。 代わりに、このファイルは dbt テンプレート機能を使用して、ランタイム時に資格情報を動的に挿入します。

    生成された資格情報は、実行期間中 (最大 30 日間) 有効であり、完了後に自動的に取り消されます。

  4. このファイルを Git にチェックインし、フォークしたリポジトリにプッシュします。 たとえば、次のようなコマンドを実行できます。

    git add profiles.yml
    git commit -m "adding profiles.yml for my Databricks job"
    git push
    
  5. Databricks UI のサイドバーで [ワークフロー ] をクリックします 。 ジョブアイコン

  6. dbt ジョブを選択し、[ タスク] タブをクリックします。

  7. [ソース] で [編集] をクリックし、フォークされたジャッフル ショップの GitHub リポジトリの詳細を入力します。

    フォークされたプロジェクト リポジトリを構成する
  8. SQLウェアハウスで、[なし (手動)] を選択します。

  9. [プロファイル ディレクトリ] に、 profiles.yml ファイルを含むディレクトリへの相対パスを入力します。パス値を空白のままにして、デフォルトのリポジトリルートを使用します。

(上級)ワークフロー で dbt Python モデルを使用する

Python モデルの dbt サポートはベータ版であり、dbt 1.3 以降が必要です。

dbt は、Databricks を含む特定のデータウェアハウスで Python モデル をサポートするようになりました。 dbt Python モデルを使用すると、Python エコシステムのツールを使用して、SQL では実装が困難な変換を実装できます。 dbt Python モデルで 1 つのタスクを実行する Databricks ジョブを作成することも、複数のタスクを含むワークフローの一部として dbt タスクを含めることもできます。

SQLウェアハウスを使用して dbt タスクで Python モデルを実行することはできません。 Databricksでの dbt Python モデルの使用の詳細については、dbt ドキュメントの「 特定のデータウェアハウス 」を参照してください。

エラーとトラブルシューティング

プロファイルファイルが存在しない エラー

エラー メッセージ:

dbt looked for a profiles.yml file in /tmp/.../profiles.yml but did not find one.

考えられる原因:

指定された$PATHに profiles.yml ファイルが見つかりませんでした。 dbt プロジェクトのルートに profiles.yml ファイルが含まれていることを確認します。