إنشاء أنظمة مجموعات ودفاتر ملاحظات ومهام باستخدام Terraform

توضح هذه المقالة كيفية استخدام موفر Databricks Terraform لإنشاء نظام مجموعة ودفتر ملاحظات ووظيفة في مساحة عمل Azure Databricks موجودة.

هذه المقالة هي مصاحب لمقالات بدء Azure Databricks التالية:

يمكنك أيضا تكييف تكوينات Terraform في هذه المقالة لإنشاء مجموعات ودفاتر ملاحظات ومهام مخصصة في مساحات العمل الخاصة بك.

الخطوة 1: إنشاء وتكوين مشروع Terraform

  1. إنشاء مشروع Terraform باتباع الإرشادات الواردة في قسم المتطلبات في مقالة نظرة عامة على موفر Databricks Terraform.

  2. لإنشاء نظام مجموعة، قم بإنشاء ملف باسم cluster.tf، وأضف المحتوى التالي إلى الملف. ينشئ هذا المحتوى مجموعة مع أصغر قدر من الموارد المسموح بها. يستخدم هذا نظام المجموعة أحدث إصدار من Databricks Runtime Long Term Support (LTS).

    بالنسبة لنظام مجموعة يعمل مع كتالوج 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
    }
    

    بالنسبة لنظام مجموعة لجميع الأغراض:

    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. لإنشاء نظام مجموعة، قم بإنشاء ملف آخر باسم cluster.auto.tfvars، وأضف المحتوى التالي إلى الملف. يحتوي هذا الملف على قيم متغيرة لتخصيص نظام المجموعة. استبدل قيم العنصر النائب بقيمك الخاصة.

    بالنسبة لنظام مجموعة يعمل مع كتالوج Unity:

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

    بالنسبة لنظام مجموعة لجميع الأغراض:

    cluster_name                    = "My Cluster"
    cluster_autotermination_minutes = 60
    cluster_num_workers             = 1
    
  4. لإنشاء دفتر ملاحظات، قم بإنشاء ملف آخر باسم notebook.tf، وأضف المحتوى التالي إلى الملف:

    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. إذا كنت تقوم بإنشاء نظام مجموعة، فاحفظ التعليمة البرمجية لدفتر الملاحظات التالي إلى ملف في نفس الدليل مثل notebook.tf الملف:

    بالنسبة لدفتر ملاحظات Python الخاص بالبرنامج التعليمي: تشغيل مسار تحليلات مستودع شامل، ملف يسمى notebook-getting-started-lakehouse-e2e.py بالمحتويات التالية:

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

    بالنسبة لدفتر ملاحظات Python للتشغيل السريع: قم بتشغيل مهمة Spark على مساحة عمل Azure Databricks باستخدام مدخل Microsoft Azure، وهو ملف يسمى notebook-quickstart-create-databricks-workspace-portal.py بالمحتويات التالية:

    # 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. إذا كنت تقوم بإنشاء دفتر ملاحظات، فبادر بإنشاء ملف آخر باسم notebook.auto.tfvars، وأضف المحتوى التالي إلى الملف. يحتوي هذا الملف على قيم متغيرة لتخصيص تكوين دفتر الملاحظات.

    بالنسبة لدفتر ملاحظات Python الخاص بالبرنامج التعليمي: تشغيل مسار تحليلات مستودع شامل:

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

    لدفتر ملاحظات Python للتشغيل السريع: قم بتشغيل مهمة Spark على مساحة عمل Azure Databricks باستخدام مدخل Microsoft Azure:

    notebook_subdirectory = "Terraform"
    notebook_filename     = "notebook-quickstart-create-databricks-workspace-portal.py"
    notebook_language     = "PYTHON"
    
  7. إذا كنت تقوم بإنشاء دفتر ملاحظات، في مساحة عمل Azure Databricks، فتأكد من إعداد أي متطلبات لتشغيل دفتر الملاحظات بنجاح، بالإشارة إلى الإرشادات التالية من أجل:

  8. لإنشاء المهمة، قم بإنشاء ملف آخر باسم job.tf، وأضف المحتوى التالي إلى الملف. ينشئ هذا المحتوى مهمة لتشغيل دفتر الملاحظات.

    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. إذا كنت تقوم بإنشاء مهمة، فبادر بإنشاء ملف آخر باسم job.auto.tfvars، وأضف المحتوى التالي إلى الملف. يحتوي هذا الملف على قيمة متغيرة لتخصيص تكوين الوظيفة.

    job_name = "My Job"
    task_key = "my_task"
    

الخطوة 2: تشغيل التكوينات

في هذه الخطوة، يمكنك تشغيل تكوينات Terraform لنشر نظام المجموعة ودفتر الملاحظات والمهمة في مساحة عمل Azure Databricks.

  1. تحقق لمعرفة ما إذا كانت تكوينات Terraform صالحة عن طريق تشغيل terraform validate الأمر. إذا تم الإبلاغ عن أي أخطاء، فقم بإصلاحها، ثم قم بتشغيل الأمر مرة أخرى.

    terraform validate
    
  2. تحقق لمعرفة ما سيفعله Terraform في مساحة العمل الخاصة بك، قبل أن يقوم Terraform بذلك بالفعل، عن طريق تشغيل terraform plan الأمر .

    terraform plan
    
  3. انشر نظام المجموعة ودفتر الملاحظات والمهمة في مساحة العمل الخاصة بك عن طريق تشغيل terraform apply الأمر . عند مطالبتك بالنشر، اكتب yes واضغط على مفتاح الإدخال Enter.

    terraform apply
    

    ينشر Terraform الموارد المحددة في مشروعك. قد يستغرق نشر هذه الموارد (خاصة نظام المجموعة) عدة دقائق.

الخطوة 3: استكشاف النتائج

  1. إذا قمت بإنشاء نظام مجموعة، في إخراج terraform apply الأمر، انسخ الارتباط بجوار cluster_url، والصقه في شريط عناوين مستعرض الويب الخاص بك.

  2. إذا قمت بإنشاء دفتر ملاحظات، في إخراج terraform apply الأمر، انسخ الارتباط الموجود بجانب notebook_url، والصقه في شريط عناوين مستعرض الويب.

    إشعار

    قبل استخدام دفتر الملاحظات، قد تحتاج إلى تخصيص محتوياته. راجع الوثائق ذات الصلة حول كيفية تخصيص دفتر الملاحظات.

  3. إذا قمت بإنشاء مهمة، في إخراج terraform apply الأمر، انسخ الارتباط بجوار job_url، والصقه في شريط عناوين مستعرض الويب الخاص بك.

    إشعار

    قبل تشغيل دفتر الملاحظات، قد تحتاج إلى تخصيص محتوياته. راجع الارتباطات في بداية هذه المقالة للحصول على وثائق ذات صلة حول كيفية تخصيص دفتر الملاحظات.

  4. إذا قمت بإنشاء وظيفة، فقم بتشغيل المهمة على النحو التالي:

    1. انقر فوق تشغيل الآن في صفحة المهمة.
    2. بعد انتهاء المهمة قيد التشغيل، لعرض نتائج تشغيل الوظيفة، في قائمة عمليات التشغيل المكتملة (ال 60 يوما الماضية) على صفحة المهمة، انقر فوق أحدث إدخال وقت في عمود وقت البدء. يعرض جزء Output نتيجة تشغيل التعليمات البرمجية لدفتر الملاحظات.

الخطوة 4: التنظيف

في هذه الخطوة، يمكنك حذف الموارد السابقة من مساحة العمل الخاصة بك.

  1. تحقق لمعرفة ما سيفعله Terraform في مساحة العمل الخاصة بك، قبل أن يقوم Terraform بذلك بالفعل، عن طريق تشغيل terraform plan الأمر .

    terraform plan
    
  2. احذف نظام المجموعة ودفتر الملاحظات والمهمة من مساحة العمل الخاصة بك عن طريق تشغيل terraform destroy الأمر . عند مطالبتك بالحذف، اكتب yes واضغط على مفتاح الإدخال Enter.

    terraform destroy
    

    يحذف Terraform الموارد المحددة في مشروعك.