Sdílet prostřednictvím


Vytváření clusterů, poznámkových bloků a úloh pomocí Terraformu

Tento článek ukazuje, jak pomocí poskytovatele Terraformu Databricks vytvořit cluster, poznámkový blok a úlohu v existujícím pracovním prostoru Azure Databricks.

Tento článek je společníkem následujících článků začínáme s Azure Databricks:

Konfigurace Terraformu v tomto článku můžete také přizpůsobit tak, aby ve vašich pracovních prostorech vytvářely vlastní clustery, poznámkové bloky a úlohy.

Krok 1: Vytvoření a konfigurace projektu Terraformu

  1. Podle pokynů v části Požadavky v článku s přehledem zprostředkovatele Databricks Terraform vytvořte projekt Terraformu.

  2. Pokud chcete vytvořit cluster, vytvořte soubor s názvem cluster.tfa přidejte do souboru následující obsah. Tento obsah vytvoří cluster s nejmenším povoleným množstvím prostředků. Tento cluster používá nejnovější verzi dlouhodobé podpory modulu Databricks Runtime (LTS).

    Cluster, který funguje s katalogem Unity:

    variable "cluster_name" {}
    variable "cluster_autotermination_minutes" {}
    variable "cluster_num_workers" {}
    variable "cluster_data_security_mode" {}
    
    # Create the cluster with the "smallest" amount
    # of resources allowed.
    data "databricks_node_type" "smallest" {
      local_disk = true
    }
    
    # Use the latest Databricks Runtime
    # Long Term Support (LTS) version.
    data "databricks_spark_version" "latest_lts" {
      long_term_support = true
    }
    
    resource "databricks_cluster" "this" {
      cluster_name            = var.cluster_name
      node_type_id            = data.databricks_node_type.smallest.id
      spark_version           = data.databricks_spark_version.latest_lts.id
      autotermination_minutes = var.cluster_autotermination_minutes
      num_workers             = var.cluster_num_workers
      data_security_mode      = var.cluster_data_security_mode
    }
    
    output "cluster_url" {
     value = databricks_cluster.this.url
    }
    

    Pro cluster pro všechny účely:

    variable "cluster_name" {
      description = "A name for the cluster."
      type        = string
      default     = "My Cluster"
    }
    
    variable "cluster_autotermination_minutes" {
      description = "How many minutes before automatically terminating due to inactivity."
      type        = number
      default     = 60
    }
    
    variable "cluster_num_workers" {
      description = "The number of workers."
      type        = number
      default     = 1
    }
    
    # Create the cluster with the "smallest" amount
    # of resources allowed.
    data "databricks_node_type" "smallest" {
      local_disk = true
    }
    
    # Use the latest Databricks Runtime
    # Long Term Support (LTS) version.
    data "databricks_spark_version" "latest_lts" {
      long_term_support = true
    }
    
    resource "databricks_cluster" "this" {
      cluster_name            = var.cluster_name
      node_type_id            = data.databricks_node_type.smallest.id
      spark_version           = data.databricks_spark_version.latest_lts.id
      autotermination_minutes = var.cluster_autotermination_minutes
      num_workers             = var.cluster_num_workers
    }
    
    output "cluster_url" {
     value = databricks_cluster.this.url
    }
    
  3. Pokud chcete vytvořit cluster, vytvořte další soubor s názvem cluster.auto.tfvarsa přidejte do souboru následující obsah. Tento soubor obsahuje proměnné hodnoty pro přizpůsobení clusteru. Zástupné hodnoty nahraďte vlastními hodnotami.

    Cluster, který funguje s katalogem Unity:

    cluster_name                    = "My Cluster"
    cluster_autotermination_minutes = 60
    cluster_num_workers             = 1
    cluster_data_security_mode      = "SINGLE_USER"
    

    Pro cluster pro všechny účely:

    cluster_name                    = "My Cluster"
    cluster_autotermination_minutes = 60
    cluster_num_workers             = 1
    
  4. Pokud chcete vytvořit poznámkový blok, vytvořte další soubor s názvem notebook.tfa přidejte do souboru následující obsah:

    variable "notebook_subdirectory" {
      description = "A name for the subdirectory to store the notebook."
      type        = string
      default     = "Terraform"
    }
    
    variable "notebook_filename" {
      description = "The notebook's filename."
      type        = string
    }
    
    variable "notebook_language" {
      description = "The language of the notebook."
      type        = string
    }
    
    resource "databricks_notebook" "this" {
      path     = "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
      language = var.notebook_language
      source   = "./${var.notebook_filename}"
    }
    
    output "notebook_url" {
     value = databricks_notebook.this.url
    }
    
  5. Pokud vytváříte cluster, uložte následující kód poznámkového bloku do souboru ve stejném adresáři jako soubor notebook.tf :

    Pro poznámkový blok Pythonu pro kurz: Spusťte ucelený analytický kanál Lakehouse s názvem notebook-getting-started-lakehouse-e2e.py s následujícím obsahem:

    # Databricks notebook source
    external_location = "<your_external_location>"
    catalog = "<your_catalog>"
    
    dbutils.fs.put(f"{external_location}/foobar.txt", "Hello world!", True)
    display(dbutils.fs.head(f"{external_location}/foobar.txt"))
    dbutils.fs.rm(f"{external_location}/foobar.txt")
    
    display(spark.sql(f"SHOW SCHEMAS IN {catalog}"))
    
    # COMMAND ----------
    
    from pyspark.sql.functions import col
    
    # Set parameters for isolation in workspace and reset demo
    username = spark.sql("SELECT regexp_replace(current_user(), '[^a-zA-Z0-9]', '_')").first()[0]
    database = f"{catalog}.e2e_lakehouse_{username}_db"
    source = f"{external_location}/e2e-lakehouse-source"
    table = f"{database}.target_table"
    checkpoint_path = f"{external_location}/_checkpoint/e2e-lakehouse-demo"
    
    spark.sql(f"SET c.username='{username}'")
    spark.sql(f"SET c.database={database}")
    spark.sql(f"SET c.source='{source}'")
    
    spark.sql("DROP DATABASE IF EXISTS ${c.database} CASCADE")
    spark.sql("CREATE DATABASE ${c.database}")
    spark.sql("USE ${c.database}")
    
    # Clear out data from previous demo execution
    dbutils.fs.rm(source, True)
    dbutils.fs.rm(checkpoint_path, True)
    
    # Define a class to load batches of data to source
    class LoadData:
    
      def __init__(self, source):
        self.source = source
    
      def get_date(self):
        try:
          df = spark.read.format("json").load(source)
        except:
            return "2016-01-01"
        batch_date = df.selectExpr("max(distinct(date(tpep_pickup_datetime))) + 1 day").first()[0]
        if batch_date.month == 3:
          raise Exception("Source data exhausted")
          return batch_date
    
      def get_batch(self, batch_date):
        return (
          spark.table("samples.nyctaxi.trips")
            .filter(col("tpep_pickup_datetime").cast("date") == batch_date)
        )
    
      def write_batch(self, batch):
        batch.write.format("json").mode("append").save(self.source)
    
      def land_batch(self):
        batch_date = self.get_date()
        batch = self.get_batch(batch_date)
        self.write_batch(batch)
    
    RawData = LoadData(source)
    
    # COMMAND ----------
    
    RawData.land_batch()
    
    # COMMAND ----------
    
    # Import functions
    from pyspark.sql.functions import col, current_timestamp
    
    # Configure Auto Loader to ingest JSON data to a Delta table
    (spark.readStream
      .format("cloudFiles")
      .option("cloudFiles.format", "json")
      .option("cloudFiles.schemaLocation", checkpoint_path)
      .load(file_path)
      .select("*", col("_metadata.file_path").alias("source_file"), current_timestamp().alias("processing_time"))
      .writeStream
      .option("checkpointLocation", checkpoint_path)
      .trigger(availableNow=True)
      .option("mergeSchema", "true")
      .toTable(table))
    
    # COMMAND ----------
    
    df = spark.read.table(table_name)
    
    # COMMAND ----------
    
    display(df)
    

    Poznámkový blok Pythonu pro rychlý start: Spuštění úlohy Sparku v pracovním prostoru Azure Databricks pomocí webu Azure Portal, souboru s názvem notebook-quickstart-create-databricks-workspace-portal.py s následujícím obsahem:

    # Databricks notebook source
    blob_account_name = "azureopendatastorage"
    blob_container_name = "citydatacontainer"
    blob_relative_path = "Safety/Release/city=Seattle"
    blob_sas_token = r""
    
    # COMMAND ----------
    
    wasbs_path = 'wasbs://%s@%s.blob.core.windows.net/%s' % (blob_container_name, blob_account_name,blob_relative_path)
    spark.conf.set('fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name), blob_sas_token)
    print('Remote blob path: ' + wasbs_path)
    
    # COMMAND ----------
    
    df = spark.read.parquet(wasbs_path)
    print('Register the DataFrame as a SQL temporary view: source')
    df.createOrReplaceTempView('source')
    
    # COMMAND ----------
    
    print('Displaying top 10 rows: ')
    display(spark.sql('SELECT * FROM source LIMIT 10'))
    
  6. Pokud vytváříte poznámkový blok, vytvořte další soubor s názvem notebook.auto.tfvarsa přidejte do souboru následující obsah. Tento soubor obsahuje hodnoty proměnných pro přizpůsobení konfigurace poznámkového bloku.

    Poznámkový blok Pythonu pro kurz: Spuštění kompletního analytického kanálu Lakehouse:

    notebook_subdirectory = "Terraform"
    notebook_filename     = "notebook-getting-started-lakehouse-e2e.py"
    notebook_language     = "PYTHON"
    

    Poznámkový blok Pythonu pro rychlý start: Spuštění úlohy Sparku v pracovním prostoru Azure Databricks pomocí webu Azure Portal:

    notebook_subdirectory = "Terraform"
    notebook_filename     = "notebook-quickstart-create-databricks-workspace-portal.py"
    notebook_language     = "PYTHON"
    
  7. Pokud vytváříte poznámkový blok, nezapomeňte v pracovním prostoru Azure Databricks nastavit všechny požadavky na úspěšné spuštění poznámkového bloku podle následujících pokynů:

  8. Chcete-li vytvořit úlohu, vytvořte další soubor s názvem job.tfa přidejte do souboru následující obsah. Tento obsah vytvoří úlohu pro spuštění poznámkového bloku.

    variable "job_name" {
      description = "A name for the job."
      type        = string
      default     = "My Job"
    }
    
    variable "task_key" {
      description = "A name for the task."
      type        = string
      default     = "my_task"
    }
    
    resource "databricks_job" "this" {
      name = var.job_name
      task {
        task_key = var.task_key
        existing_cluster_id = databricks_cluster.this.cluster_id
        notebook_task {
          notebook_path = databricks_notebook.this.path
        }
      }
      email_notifications {
        on_success = [ data.databricks_current_user.me.user_name ]
        on_failure = [ data.databricks_current_user.me.user_name ]
      }
    }
    
    output "job_url" {
      value = databricks_job.this.url
    }
    
  9. Pokud vytváříte úlohu, vytvořte další soubor s názvem job.auto.tfvarsa přidejte do souboru následující obsah. Tento soubor obsahuje hodnotu proměnné pro přizpůsobení konfigurace úlohy.

    job_name = "My Job"
    task_key = "my_task"
    

Krok 2: Spuštění konfigurací

V tomto kroku spustíte konfigurace Terraformu pro nasazení clusteru, poznámkového bloku a úlohy do pracovního prostoru Azure Databricks.

  1. Spuštěním příkazu zkontrolujte, jestli jsou konfigurace Terraformu terraform validate platné. Pokud jsou nahlášeny nějaké chyby, opravte je a spusťte příkaz znovu.

    terraform validate
    
  2. Spuštěním terraform plan příkazu zkontrolujte, co Bude Terraform ve vašem pracovním prostoru dělat. Teprve pak terraform skutečně provede.

    terraform plan
    
  3. Spuštěním terraform apply příkazu nasaďte cluster, poznámkový blok a úlohu do pracovního prostoru. Po zobrazení výzvy k nasazení zadejte yes a stiskněte Enter.

    terraform apply
    

    Terraform nasadí prostředky zadané v projektu. Nasazení těchto prostředků (zejména clusteru) může trvat několik minut.

Krok 3: Prozkoumání výsledků

  1. Pokud jste vytvořili cluster, zkopírujte ve výstupu terraform apply příkazu odkaz vedle cluster_urlněj a vložte ho do adresního řádku webového prohlížeče.

  2. Pokud jste vytvořili poznámkový blok, zkopírujte ve výstupu terraform apply příkazu odkaz vedle notebook_urlněj a vložte ho do adresního řádku webového prohlížeče.

    Poznámka:

    Než poznámkový blok použijete, možná budete muset přizpůsobit jeho obsah. Informace o přizpůsobení poznámkového bloku najdete v související dokumentaci.

  3. Pokud jste vytvořili úlohu, zkopírujte ve výstupu terraform apply příkazu odkaz vedle job_urlněj a vložte ho do adresního řádku webového prohlížeče.

    Poznámka:

    Než poznámkový blok spustíte, budete možná muset přizpůsobit jeho obsah. Další informace o přizpůsobení poznámkového bloku najdete na odkazech na začátku tohoto článku.

  4. Pokud jste vytvořili úlohu, spusťte úlohu následujícím způsobem:

    1. Na stránce úlohy klikněte na Spustit .
    2. Jakmile se úloha dokončí, zobrazí se výsledky spuštění úlohy v seznamu Dokončená spuštění (posledních 60 dnů) na stránce úlohy, klikněte na poslední položku času ve sloupci Čas zahájení . V podokně Výstup se zobrazí výsledek spuštění kódu poznámkového bloku.

Krok 4: Vyčištění

V tomto kroku odstraníte předchozí prostředky z pracovního prostoru.

  1. Spuštěním terraform plan příkazu zkontrolujte, co Bude Terraform ve vašem pracovním prostoru dělat. Teprve pak terraform skutečně provede.

    terraform plan
    
  2. Spuštěním terraform destroy příkazu odstraňte cluster, poznámkový blok a úlohu z pracovního prostoru. Po zobrazení výzvy k odstranění zadejte yes a stiskněte Enter.

    terraform destroy
    

    Terraform odstraní prostředky zadané v projektu.