在 Azure Databricks 作業中使用 dbt 轉換

您可以在 Azure Databricks 作業中以工作的形式執行 dbt Core 專案。 藉由以作業工作的形式執行 dbt Core 專案,您可以受益於下列 Azure Databricks 作業功能:

  • 將 dbt 工作自動化,並排程包含 dbt 工作的工作流程。
  • 監視 dbt 轉換,並傳送轉換狀態的通知。
  • 使用其他工作在工作流程中包含 dbt 專案。 例如,您的工作流程可以使用自動載入器擷取數據、使用 dbt 轉換數據,以及使用筆記本工作分析數據。
  • 從作業執行自動封存成品,包括記錄、結果、指令清單和設定。

若要深入瞭解 dbt Core,請參閱 dbt 檔

開發和生產工作流程

Databricks 建議針對 Databricks SQL 倉儲開發 dbt 專案。 使用 Databricks SQL 倉儲,可以測試 dbt 所產生的 SQL,並使用 SQL 倉儲查詢歷程記錄來偵錯 dbt 所產生的查詢。

若要在生產環境中執行 dbt 轉換,Databricks 建議在 Databricks 作業中使用 dbt 工作。 根據預設,dbt 工作會使用 Azure Databricks 計算來執行 dbt Python 程式,以及針對所選 SQL 倉儲產生的 dbt 產生的 SQL。

您可以在無伺服器 SQL 倉儲或 Pro SQL 倉儲、Azure Databricks 計算或任何其他 dbt 支援的倉儲上執行 dbt 轉換。 本文將討論前兩個選項與範例。

如果您的工作區已啟用 Unity 目錄,且 已啟用無伺服器工作流程 ,則作業預設會在無伺服器計算上執行。

注意

針對 SQL 倉儲開發 dbt 模型,並在 Azure Databricks 計算的生產環境中執行它們,可能會導致效能和 SQL 語言支援方面的細微差異。 Databricks 建議針對計算和 SQL 倉儲使用相同的 Databricks 運行時間版本。

需求

  • 若要瞭解如何使用 dbt Core 和dbt-databricks套件在開發環境中建立及執行 dbt 專案,請參閱 連線 dbt Core

    Databricks 建議 dbt-databricks 套件,而不是 dbt-spark 套件。 dbt-databricks 套件是根據 Databricks 進行最佳化的 dbt-spark 分支。

  • 若要在 Azure Databricks 作業中使用 dbt 專案,您必須設定 Git 與 Databricks Git 資料夾的整合。 您無法從 DBFS 執行 dbt 專案。

  • 您必須 啟用無伺服器或 Pro SQL 倉儲

  • 您必須擁有 Databricks SQL 權利

建立並執行您的第一個 dbt 作業

下列範例會 使用 jaffle_shop 專案,這是示範核心 dbt 概念的範例專案。 若要建立執行 jaffle 商店項目的作業,請執行下列步驟。

  1. 移至您的 Azure Databricks 登陸頁面,並執行下列其中一項:

    • 點選 作業圖示提要欄位中的 [工作流程 ],然後按下 建立作業按鈕
    • 在提要欄位中,按兩下 新增圖示[新增 ],然後選取 [ 作業]。
  2. 在 [工作] 索引標籤上的工作文字框中,將 [新增作業的名稱...] 取代為您的作業名稱。

  3. 在 [ 工作名稱] 中,輸入工作的名稱。

  4. [類型] 中 ,選取 dbt 工作類型。

    新增 dbt 工作

  5. 在 [ 來源 ] 下拉功能表中,您可以選取 [工作區 ] 以使用位於 Azure Databricks 工作區資料夾中的 dbt 專案,或 針對位於遠端 Git 存放庫的專案使用 Git 提供者 。 由於此範例使用位於 Git 存放庫中的 jaffle Shop 專案,請選取 [Git 提供者],單擊 [編輯],然後輸入 jaffle Shop GitHub 存放庫的詳細數據。

    設定 dbt 專案存放庫

    • Git 存放庫 URL 中,輸入 jaffle 商店專案的 URL。
    • Git 參考中, 輸入main 。 您也可以使用標籤或 SHA。
  6. 按一下 [確認]

  7. dbt 命令 文字框中,指定要執行的 dbt 命令(depsseedrun)。 您必須在每個指令前面加上 dbt。 命令會依指定的順序執行。

    設定 dbt 命令

  8. SQL 倉儲中,選取 SQL 倉儲以執行 dbt 所產生的 SQL。 [ SQL 倉儲 ] 下拉功能表只會顯示無伺服器和 Pro SQL 倉儲。

  9. (選擇性)您可以指定工作輸出的架構。 根據預設,會使用架構 default

  10. (選擇性)如果您想要變更執行 dbt Core 的計算組態,請按兩下 [dbt CLI 計算]。

  11. (選擇性)您可以指定工作的 dbt-databricks 版本。 例如,若要將 dbt 工作釘選到開發與生產的特定版本:

    • 在 [相依連結庫] 底下,按兩下刪除圖示目前 dbt-databricks 版本旁的 。
    • 按一下新增
    • 在 [新增相依連結庫] 對話框中,選取 [PyPI],然後在 [套件] 文本框中輸入 dbt-package 版本(例如 , 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": "Standard_DS3_v2",
        "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 工作(建議)或所有用途的計算,請使用自定義 profiles.yml 定義倉儲或 Azure Databricks 計算來連線。 若要建立使用倉儲或全用途計算執行 jaffle Shop 專案的作業,請執行下列步驟。

注意

只有 SQL 倉儲或所有用途的計算可作為 dbt 工作的目標。 您無法使用作業計算作為 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> 為項目數據表的架構名稱。
    • 若要使用 SQL 倉儲執行 dbt 工作,請以 SQL 倉儲的 [連線 詳細資料] 索引標籤標的 [伺服器主機名] 值取代 <http-host> 。 若要使用所有用途的計算執行 dbt 工作,請以 Azure Databricks 計算的 [進階選項]、[JDBC/ODBC] 索引標籤中的 [伺服器主機名] 值取代 <http-host>
    • 若要使用 SQL 倉儲執行 dbt 工作,請將 取代<http-path>為您 SQL 倉儲的 [連線 ion 詳細資料] 索引卷標的 [HTTP 路徑] 值。 若要使用所有用途的計算來執行 dbt 工作,請以 Azure Databricks 計算的 [進階選項]、[JDBC/ODBC] 索引標籤中的 HTTP 路徑值取代 <http-path>

    您不會在檔案中指定秘密,例如存取令牌,因為您會將此檔案簽入原始檔控制。 相反地,此檔案會使用 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. [來源] 中,按兩下 [ 編輯 ],然後輸入您的分支 jaffle 商店 GitHub 存放庫詳細數據。

    設定分叉專案存放庫

  8. 在 SQL 倉儲,選取 [無] [手動]。

  9. [配置文件目錄] 中,輸入包含檔案之目錄的 profiles.yml 相對路徑。 將路徑值保留空白,以使用存放庫根目錄的預設值。

(進階)在工作流程中使用 dbt Python 模型

注意

Python 模型的 dbt 支援處於於搶鮮版 (Beta),而且需要 dbt 1.3 或更新版本。

dbt 現在支援 特定數據倉儲上的 Python 模型 ,包括 Databricks。 透過 dbt Python 模型,您可以使用 Python 生態系統中的工具來實作難以透過 SQL 實作的轉換。 您可以建立 Azure Databricks 作業,以使用 dbt Python 模型執行單一工作,也可以包含 dbt 工作,作為包含多個工作的工作流程的一部分。

您無法使用 SQL 倉儲在 dbt 工作中執行 Python 模型。 如需搭配 Azure Databricks 使用 dbt Python 模型的詳細資訊,請參閱 dbt 文件中的特定資料倉儲

錯誤和疑難排解

配置檔案不存在 錯誤

錯誤訊息

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

可能的原因:

profiles.yml在指定的$PATH中找不到檔案。 請確定 dbt 專案的根目錄包含 profiles.yml 檔案。