分享方式:


Terraform CDK Databricks 提供者

注意

本文涵蓋 Terraform 的雲端開發工具包 (CDKTF),Databricks 既未提供也不支援。 若要連絡提供者,請參閱 Terraform Community

本文說明如何使用 Python 以及 Terraform CDK Databricks 提供者適用於 Terraform 的雲端開發工具包 (CDKTF) 。 CDKTF 是第三方基礎結構即程式代碼 (IaC) 平臺,可讓您使用熟悉的程式設計語言、工具和工程實務來建立、部署及管理 Azure Databricks 資源。 雖然本文說明如何使用 Python,但 CDKTF 支援其他語言,例如 TypeScript、Java、C# 和 Go。

Terraform CDK Databricks 提供者是以 Databricks Terraform 提供者為基礎。 如需詳細資訊,請參閱 Terraform Cloud。 CDKTF 是以 AWS 雲端開發工具套件 (AWS CDK) 為基礎

需求

您必須擁有 Azure Databricks 工作區,因為本文會將資源部署至現有的工作區。

在本機開發計算機上,您必須安裝下列專案:

步驟 1:建立 CDKTF 專案

在此步驟中,您會在本機開發計算機上設定CDKTF專案的必要目錄結構。 接著,您會在此目錄結構中建立CDKTF專案。

  1. 為您的 CDKTF 專案建立空白目錄,然後切換至該目錄。 在終端機中或使用 PowerShell 執行下列命令:

    Unix、Linux 和macOS

    mkdir cdktf-demo
    cd cdktf-demo
    

    Windows

    md cdktf-demo
    cd cdktf-demo
    
  2. 執行下列命令來建立CDKTF專案:

    cdktf init --template=python --local
    
  3. 當系統提示您輸入項目名稱時,按 Enter 鍵接受 的預設項目名稱cdktf-demo

  4. 當系統提示您輸入 專案描述時,按 Enter 鍵接受預設專案描述。

  5. 如果出現 [您要從現有的 Terraform 項目開始] 的提示,請輸入 N ,然後按 Enter

  6. 如果系統提示您是否要將當機報告傳送給CDKTF小組,請輸入 ,然後按 Enter n鍵。

CDKTF 會在您的 cdktf-demo 目錄中建立下列檔案和子目錄:

  • .gitignore,這是如果您想要將此專案推送至遠端 Git 存放庫,Git 會忽略的檔案和目錄清單。
  • cdktf.json,其中包含CDKTF專案的組態設定。 如需組態設定的詳細資訊,請參閱 組態檔
  • help,其中包含一些後續步驟的相關信息,可讓您使用CDKTF專案。
  • main-test.py,其中包含您可以為CDKTF專案撰寫的支援單元測試。 如需單元測試的詳細資訊,請參閱 單元測試
  • main.py,其中包含您為CDKTF專案撰寫的 Python 程式代碼。
  • PipfilePipfile.lock,其會管理CDKTF專案的程式代碼相依性。

步驟 2:定義資源

在此步驟中,您會使用 Terraform CDK Databricks 提供者來定義筆記本,以及執行該筆記本的作業。

  1. 安裝專案相依性:使用 pipenv,將 Terraform CDK Databricks 提供者安裝到 CDKTF 專案中,以產生 Azure Databricks 資源。 若要這樣做,請執行下列命令:

    pipenv install cdktf-cdktf-provider-databricks
    
  2. 以下列程式代碼取代檔案的內容 main.py 。 此程式代碼會向 Azure Databricks 工作區驗證 CDKTF,然後產生筆記本以及執行筆記本的作業。 若要檢視此程式代碼的語法檔,請參閱 PythonTerraform CDK Databricks 提供者建構參考。

    #!/usr/bin/env python
    from constructs import Construct
    from cdktf import (
      App, TerraformStack, TerraformOutput
    )
    from cdktf_cdktf_provider_databricks import (
      data_databricks_current_user,
      job, notebook, provider
    )
    import vars
    from base64 import b64encode
    
    class MyStack(TerraformStack):
      def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)
    
        provider.DatabricksProvider(
          scope = self,
          id    = "databricksAuth"
        )
    
        current_user = data_databricks_current_user.DataDatabricksCurrentUser(
          scope     = self,
          id_       = "currentUser"
        )
    
        # Define the notebook.
        my_notebook = notebook.Notebook(
          scope          = self,
          id_            = "notebook",
          path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
          language       = "PYTHON",
          content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
        )
    
        # Define the job to run the notebook.
        my_job = job.Job(
          scope = self,
          id_ = "job",
          name = f"{vars.resource_prefix}-job",
          task = [ 
            job.JobTask(
              task_key = f"{vars.resource_prefix}-task",
              new_cluster = job.JobTaskNewCluster(
                num_workers   = vars.num_workers,
                spark_version = vars.spark_version,
                node_type_id  = vars.node_type_id
              ),
              notebook_task = job.JobTaskNotebookTask(
                notebook_path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py"
              ),
              email_notifications = job.JobTaskEmailNotifications(
                on_success = [ current_user.user_name ],
                on_failure = [ current_user.user_name ]
              )
            )
          ]
        )
    
        # Output the notebook and job URLs.
        TerraformOutput(
          scope = self,
          id    = "Notebook URL",
          value = my_notebook.url
        )
    
        TerraformOutput(
          scope = self,
          id    = "Job URL",
          value = my_job.url
        )
    
    app = App()
    MyStack(app, "cdktf-demo")
    app.synth()
    
  3. 在與 main.py相同的目錄中建立名為 vars.py 的檔案。 以您自己的值取代下列值,以指定資源前置詞和叢集設定,例如背景工作角色數目、Spark 運行時間版本字串節點類型

    #!/usr/bin/env python
    resource_prefix = "cdktf-demo"
    num_workers     = 1
    spark_version   = "14.3.x-scala2.12"
    node_type_id    = "Standard_D3_v2"
    

步驟 3:部署資源

在此步驟中,您會使用CDKTF CLI,將現有的 Azure Databricks 工作區、定義的筆記本和作業部署至該筆記本。

  1. 為您的CDKTF項目產生對等的 Terraform 程式代碼。 若要這樣做,請執行 cdktf synth 命令。

    cdktf synth
    
  2. 進行變更之前,您可以檢閱擱置中的資源變更。 執行下列步驟:

    cdktf diff
    
  3. 執行 cdktf deploy 命令來部署筆記本和作業。

    cdktf deploy
    
  4. 出現核准提示時,請按 Enter 鍵。 Terraform 會建立筆記本和作業,並將其部署至您的工作區。

步驟 4:與資源互動

在此步驟中,您會在 Azure Databricks 工作區中執行作業,以執行指定的筆記本。

  1. 若要檢視作業將在工作區中執行的筆記本,請複製命令輸出cdk deploy中顯示的 Notebook URL 連結,並將它貼到網頁瀏覽器的網址列中。
  2. 若要檢視在工作區中執行筆記本的工作,請複製命令輸出cdk deploy中顯示的作業 URL 連結,並將它貼到網頁瀏覽器的網址列中。
  3. 若要執行作業,請按下作業頁面上的 [ 立即 執行] 按鈕。

(選擇性)步驟 5:對資源進行變更

在此選擇性步驟中,您會變更筆記本的程式代碼、重新部署已變更的筆記本,然後使用作業重新執行變更的筆記本。

如果您不想對筆記本進行任何變更,請直接跳至 步驟 6:清除

  1. 在 檔案中 main.py ,從下列內容變更 notebook 變數宣告:

    my_notebook = notebook.Notebook(
      scope          = self,
      id_            = "notebook",
      path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
      language       = "PYTHON",
      content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
    )
    

    對下列專案:

    my_notebook = notebook.Notebook(
      scope          = self,
      id_            = "notebook",
      path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
      language       = "PYTHON",
      content_base64 = b64encode(b'''
    data = [
       { "Category": 'A', "ID": 1, "Value": 121.44 },
       { "Category": 'B', "ID": 2, "Value": 300.01 },
       { "Category": 'C', "ID": 3, "Value": 10.99 },
       { "Category": 'E', "ID": 4, "Value": 33.87}
    ]
    
    df = spark.createDataFrame(data)
    
    display(df)
    ''').decode("UTF-8")
    )
    

    注意

    請確定三引號 (''') 之間的程式代碼行會對齊程式碼編輯器的邊緣,如下所示。 否則,Terraform 會將額外的空格符插入筆記本中,這可能會造成新的 Python 程式代碼無法執行。

  2. 重新產生與CDKTF專案相等的Terraform程式代碼。 若要這樣做,請執行下列命令:

    cdktf synth
    
  3. 進行變更之前,您可以檢閱擱置中的資源變更。 執行下列步驟:

    cdktf diff
    
  4. 執行 cdktf deploy 命令來部署筆記本變更。

    cdktf deploy
    
  5. 出現核准提示時,請按 Enter 鍵。 Terraform 會變更筆記本的內容。

  6. 若要檢視作業將在工作區中執行的已變更筆記本,請重新整理您稍早開啟的筆記本,或複製命令輸出cdk deploy中顯示的 Notebook URL 連結,並將其貼到網頁瀏覽器的網址列中。

  7. 若要檢視在工作區中執行已變更筆記本的作業,請重新整理您稍早開啟的作業,或複製命令輸出cdk deploy中顯示的作業 URL 連結,並將其貼到網頁瀏覽器的網址列中。

  8. 若要執行作業,請按下作業頁面上的 [ 立即 執行] 按鈕。

步驟 6:清除

在此步驟中,您會使用CDKTF CLI從 Azure Databricks 工作區移除筆記本和作業。

  1. 執行 cdktf destroy 命令,以從工作區移除資源:

    cdktf destroy
    
  2. 出現核准提示時,請按 Enter 鍵。 Terraform 會從工作區中移除資源。

測試

您可以在部署CDKTF專案之前先測試它。 請參閱 CDKTF檔中的單元測試

針對以 Python 為基礎的 CDKTF 專案,您可以使用 Python 測試架構 pytest 以及 cdktf 套件的 Testing 類別來撰寫和執行測試。 下列名為 test_main.py 的範例檔案會測試本文先前 main.py 檔案中的CDKTF程式代碼。 第一個測試會檢查項目的筆記本是否包含筆記本內容的預期Base64編碼表示法。 第二個測試會檢查專案的工作是否包含預期的作業名稱。 若要執行這些測試,請從專案的根目錄執行 pytest 命令。

from cdktf import App, Testing
from cdktf_cdktf_provider_databricks import job, notebook
from main import MyStack

class TestMain:
  app = App()
  stack = MyStack(app, "cdktf-demo")
  synthesized = Testing.synth(stack)

  def test_notebook_should_have_expected_base64_content(self):
    assert Testing.to_have_resource_with_properties(
      received = self.synthesized,
      resource_type = notebook.Notebook.TF_RESOURCE_TYPE,
      properties = {
        "content_base64": "ZGlzcGxheShzcGFyay5yYW5nZSgxMCkp"
      }
    )

  def test_job_should_have_expected_job_name(self):
    assert Testing.to_have_resource_with_properties(
      received = self.synthesized,
      resource_type = job.Job.TF_RESOURCE_TYPE,
      properties = {
        "name": "cdktf-demo-job"
      }
    )

更多資源