Megosztás a következőn keresztül:


Fürtök, jegyzetfüzetek és feladatok létrehozása a Terraform használatával

Ez a cikk bemutatja, hogyan hozhat létre fürtöt, jegyzetfüzetet és feladatot a Databricks Terraform-szolgáltatóval egy meglévő Azure Databricks-munkaterületen.

Ez a cikk a következő Azure Databricks első lépéseket ismertető cikkeinek a kísérője:

A cikkben szereplő Terraform-konfigurációkat úgy is módosíthatja, hogy egyéni fürtöket, jegyzetfüzeteket és feladatokat hozzon létre a munkaterületeken.

1. lépés: A Terraform-projekt létrehozása és konfigurálása

  1. Hozzon létre egy Terraform-projektet a Databricks Terraform-szolgáltató áttekintési cikkÉnek Követelmények szakaszában található utasításokat követve.

  2. Fürt létrehozásához hozzon létre egy nevű cluster.tffájlt, és adja hozzá a következő tartalmat a fájlhoz. Ez a tartalom létrehoz egy fürtöt, amelyen a legkisebb mennyiségű erőforrás engedélyezett. Ez a fürt a databricks runtime long term support (LTS) legújabb verzióját használja.

    Unity Catalog-tal működő fürt esetén:

    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
    }
    

    Teljes célú fürt esetén:

    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. Fürt létrehozásához hozzon létre egy másik nevű fájlt cluster.auto.tfvars, és adja hozzá a következő tartalmat a fájlhoz. Ez a fájl változó értékeket tartalmaz a fürt testreszabásához. Cserélje le a helyőrző értékeket a saját értékeire.

    Unity Catalog-tal működő fürt esetén:

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

    Teljes célú fürt esetén:

    cluster_name                    = "My Cluster"
    cluster_autotermination_minutes = 60
    cluster_num_workers             = 1
    
  4. Jegyzetfüzet létrehozásához hozzon létre egy másik nevű fájlt notebook.tf, és adja hozzá a következő tartalmat a fájlhoz:

    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. Fürt létrehozásakor mentse a következő jegyzetfüzetkódot a fájllal azonos könyvtárban notebook.tf lévő fájlba:

    Az oktatóanyaghoz készült Python-jegyzetfüzet esetében : Futtasson egy teljes körű Lakehouse Analytics-folyamatot, amely a következő tartalommal elnevezett notebook-getting-started-lakehouse-e2e.py fájl:

    # 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)
    

    A Python-jegyzetfüzet rövid útmutatójához : Spark-feladat futtatása az Azure Databricks-munkaterületen az Azure Portal használatával, a következő tartalommal elnevezett notebook-quickstart-create-databricks-workspace-portal.py fájl:

    # 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. Ha jegyzetfüzetet hoz létre, hozzon létre egy másik nevű notebook.auto.tfvarsfájlt, és adja hozzá a következő tartalmat a fájlhoz. Ez a fájl változó értékeket tartalmaz a jegyzetfüzet konfigurációjának testreszabásához.

    Az oktatóanyaghoz készült Python-jegyzetfüzethez : Futtasson egy végpontok közötti lakehouse-elemzési folyamatot:

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

    A Python-jegyzetfüzet rövid útmutatójához : Spark-feladat futtatása az Azure Databricks-munkaterületen az Azure Portal használatával:

    notebook_subdirectory = "Terraform"
    notebook_filename     = "notebook-quickstart-create-databricks-workspace-portal.py"
    notebook_language     = "PYTHON"
    
  7. Ha jegyzetfüzetet hoz létre, az Azure Databricks-munkaterületen mindenképpen állítsa be a jegyzetfüzet sikeres futtatására vonatkozó követelményeket a következő utasításokra hivatkozva:

  8. A feladat létrehozásához hozzon létre egy másik nevű fájlt job.tf, és adja hozzá a következő tartalmat a fájlhoz. Ez a tartalom létrehoz egy feladatot a jegyzetfüzet futtatásához.

    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. Ha egy feladatot hoz létre, hozzon létre egy másik nevű fájlt job.auto.tfvars, és adja hozzá a következő tartalmat a fájlhoz. Ez a fájl egy változó értéket tartalmaz a feladatkonfiguráció testreszabásához.

    job_name = "My Job"
    task_key = "my_task"
    

2. lépés: A konfigurációk futtatása

Ebben a lépésben futtatja a Terraform-konfigurációkat a fürt, a jegyzetfüzet és a feladat Azure Databricks-munkaterületen való üzembe helyezéséhez.

  1. A parancs futtatásával terraform validate ellenőrizze, hogy a Terraform-konfigurációk érvényesek-e. Ha bármilyen hibát jelez, javítsa ki őket, és futtassa újra a parancsot.

    terraform validate
    
  2. A parancs futtatásával terraform plan ellenőrizze, hogy a Terraform mit fog tenni a munkaterületen, mielőtt a Terraform ténylegesen elvégzi.

    terraform plan
    
  3. A parancs futtatásával helyezze üzembe a fürtöt, a jegyzetfüzetet és a feladatot a munkaterületen terraform apply . Amikor a rendszer kéri az üzembe helyezést, írja be yes és nyomja le az Enter billentyűt.

    terraform apply
    

    A Terraform üzembe helyezi a projektben megadott erőforrásokat. Ezeknek az erőforrásoknak (különösen egy fürtnek) az üzembe helyezése több percet is igénybe vehet.

3. lépés: Az eredmények megismerése

  1. Ha létrehozott egy fürtöt, a parancs kimenetében terraform apply másolja ki a mellette lévő cluster_urlhivatkozást, és illessze be a webböngésző címsorába.

  2. Ha létrehozott egy jegyzetfüzetet, a parancs kimenetében terraform apply másolja ki a mellette lévő notebook_urlhivatkozást, és illessze be a webböngésző címsorába.

    Megjegyzés:

    A jegyzetfüzet használata előtt előfordulhat, hogy testre kell szabnia annak tartalmát. A jegyzetfüzet testreszabásáról a kapcsolódó dokumentációban olvashat.

  3. Ha létrehozott egy feladatot, a parancs kimenetében terraform apply másolja ki a mellette lévő job_urlhivatkozást, és illessze be a webböngésző címsorába.

    Megjegyzés:

    A jegyzetfüzet futtatása előtt előfordulhat, hogy testre kell szabnia annak tartalmát. A jegyzetfüzet testreszabásával kapcsolatos dokumentációt a cikk elején található hivatkozásokon találja.

  4. Ha létrehozott egy feladatot, futtassa a feladatot az alábbiak szerint:

    1. Kattintson a Futtatás gombra a feladatlapon.
    2. Miután a feladat befejeződött, a feladatfuttatás eredményeinek megtekintéséhez kattintson a feladatlap Befejezett futtatások (elmúlt 60 nap) listájában a Kezdési idő oszlopban a legutóbbi időpontra. A Kimenet panel a jegyzetfüzet kódjának futtatásának eredményét jeleníti meg.

4. lépés: Tisztítás

Ebben a lépésben törli az előző erőforrásokat a munkaterületről.

  1. A parancs futtatásával terraform plan ellenőrizze, hogy a Terraform mit fog tenni a munkaterületen, mielőtt a Terraform ténylegesen elvégzi.

    terraform plan
    
  2. A parancs futtatásával törölje a fürtöt, a jegyzetfüzetet és a feladatot a terraform destroy munkaterületről. Amikor a rendszer kéri a törlést, írja be yes és nyomja le az Enter billentyűt.

    terraform destroy
    

    A Terraform törli a projektben megadott erőforrásokat.