הגדרת פרמטרים בתבניות של תהליכי עבודה

אם תבנית תהליך העבודה תופעל כמה פעמים עם ערכים שונים, תוכלו להגדיר פרמטרים בתבנית (הגדרת פרמטרים לתבנית) כדי להימנע מעריכת תהליך העבודה בכל פעם. לאחר מכן, תוכלו להעביר ערכים שונים לפרמטרים בכל פעם שתריצו את התבנית.

שדות שאפשר להגדיר להם פרמטרים

אפשר להגדיר פרמטרים לשדות הבאים בתבנית של תהליך העבודה ב-Managed Service for Apache Spark:

  • תוויות
  • מזהי URI של קבצים
  • שם האשכול המנוהל. השירות Managed Service for Apache Spark ישתמש בשם שהמשתמש סיפק בתור תחילית השם, ויוסיף תווים אקראיים כדי ליצור שם אשכול ייחודי. האשכול נמחק בסוף תהליך העבודה.
  • מאפייני המשרה
  • ארגומנטים של משימות
  • משתני סקריפט (ב-HiveJob, ב-SparkSqlJob וב-PigJob)
  • המחלקה הראשית (ב-HadoopJob וב-SparkJob)
  • אזור (ב-ClusterSelector)
  • מספר המכונות (numInstances) בקבוצת מכונות מאסטר או בקבוצת מכונות של Worker.

מאפייני פרמטרים

הפרמטרים של תבנית תהליך העבודה מוגדרים באמצעות מאפייני החובה והמאפיינים האופציונליים הבאים:

שם (חובה)
שם משתנה בסגנון Unix. השם הזה ישמש כמפתח כשמזינים ערך לפרמטר בהמשך.
שדות (חובה)
רשימת השדות שהפרמטר הזה יחליף (ברשימה שדות שאפשר להגדיר כפרמטרים מפורטים השדות שאפשר להגדיר כפרמטרים). כל שדה מוגדר כ "נתיב שדה" (ראו תחביר של נתיב שדה כדי לדעת באיזה תחביר להשתמש כדי להגדיר נתיב שדה). שימו לב ששדה יכול להופיע לכל היותר ברשימה אחת של נתיבי שדות של פרמטר.
תיאור (אופציונלי)
תיאור קצר של הפרמטר.
אימות (אופציונלי)
כללים לאימות ערך פרמטר, שיכולים להיות אחד מהבאים:
  1. רשימה של ערכים מותרים
  2. רשימה של ביטויים רגולריים שהערך חייב להתאים להם.

תחביר של נתיב שדה

התחביר של נתיב שדה דומה לזה של FieldMask. לדוגמה, נתיב שדה שמפנה לשדה האזור של בורר האשכולות בתבנית של תהליך עבודה יצוין בתור placement.clusterSelector.zone.

נתיבי שדות יכולים להפנות לשדות באמצעות התחביר הבא:

  • שם האשכול המנוהל:

    • placement.managedCluster.clusterName
  • אפשר להפנות לערכים במפות לפי מפתח, לדוגמה:

    • labels['key']
    • placement.clusterSelector.clusterLabels['key']
    • placement.managedCluster.labels['key']
    • jobs['step-id'].labels['key']
  • אפשר להפנות למשימות ברשימת המשימות באמצעות step-id.

    • jobs['step-id'].hadoopJob.mainJarFileUri
    • jobs['step-id'].hiveJob.queryFileUri
    • ‫jobs['step-id'].pySparkJob.mainPythonFileUri
    • jobs['step-id'].hadoopJob.jarFileUris[0]
    • ‪jobs['step-id'].hadoopJob.archiveUris[0]
    • jobs['step-id'].hadoopJob.fileUris[0]
    • ‎jobs['step-id'].pySparkJob.pythonFileUris[0]‎

    • אפשר להפנות לפריטים בשדות חוזרים באמצעות אינדקס שמבוסס על אפס, לדוגמה:

    • ‎jobs['step-id'].sparkJob.args[0]‎

    • דוגמאות נוספות:

    • ‪jobs['step-id'].hadoopJob.args[0]

    • jobs['step-id'].hadoopJob.mainJarFileUri

    • jobs['step-id'].hadoopJob.properties['key']

    • jobs['step-id'].hiveJob.scriptVariables['key']

    • placement.clusterSelector.zone

אי אפשר להגדיר פרמטרים למפות ולשדות חוזרים בשלמותם. אפשר להפנות רק לערכי מפה נפרדים ולפריטים נפרדים בשדות חוזרים. לדוגמה, נתיבי השדות הבאים לא תקינים:

placement.clusterSelector.clusterLabels
jobs['step-id'].sparkJob.args

הגדרת פרמטרים לתבנית של תהליך עבודה

כדי להגדיר פרמטרים לתבנית של תהליך עבודה, מגדירים פרמטרים של תבנית באמצעות Dataproc API או Google Cloud CLI.

פקודת gcloud

כדי להגדיר פרמטרים של תבנית של תהליך עבודה, אפשר ליצור קובץ YAML של תבנית של תהליך עבודה, או לייצא אותו באמצעות Google Cloud CLI ולערוך אותו. לאחר מכן, אפשר לייבא את הקובץ באמצעות Google Cloud CLI כדי ליצור או לעדכן את התבנית. מידע נוסף מופיע במאמר שימוש בקובצי YAML.

דוגמה 1: תבנית של אשכול מנוהל עם פרמטרים

הקוד הבא הוא דוגמה לקובץ YAML של תבנית teragen-terasort של תהליך עבודה של אשכול מנוהל, עם ארבעה פרמטרים מוגדרים: CLUSTER, ‏ NUM_ROWS, ‏ GEN_OUT ו-SORT_OUT. מופיעות שתי גרסאות: אחת לפני הגדרת הפרמטרים והשנייה אחרי הגדרת הפרמטרים.

לפני

placement:
  managedCluster:
    clusterName: my-managed-cluster
    config:
      gceClusterConfig:
        zoneUri: us-central1-a
jobs:
- hadoopJob:
    args:
    - teragen
    - '10000'
    - hdfs:///gen/
    mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
  stepId: teragen
- hadoopJob:
    args:
    - terasort
    - hdfs:///gen/
    - hdfs:///sort/
    mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
  prerequisiteStepIds:
  - teragen
  stepId: terasort

אחרי

placement:
  managedCluster:
    clusterName: 'to-be-determined'
    config:
      gceClusterConfig:
        zoneUri: us-central1-a
jobs:
- hadoopJob:
    args:
    - teragen
    - '10000'
    - hdfs:///gen/
    mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
  stepId: teragen
- hadoopJob:
    args:
    - terasort
    - hdfs:///gen/
    - hdfs:///sort/
    mainJarFileUri: file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar
  prerequisiteStepIds:
  - teragen
  stepId: terasort
parameters:
- description: The managed cluster name prefix
  fields:
  - placement.managedCluster.clusterName
  name: CLUSTER
- description: The number of rows to generate
  fields:
  - jobs['teragen'].hadoopJob.args[1]
  name: NUM_ROWS
  validation:
    values:
      values:
      - '1000'
      - '10000'
      - '100000'
- description: Output directory for teragen
  fields:
  - jobs['teragen'].hadoopJob.args[2]
  - jobs['terasort'].hadoopJob.args[1]
  name: GEN_OUT
  validation:
    regex:
      regexes:
      - hdfs:///.*
- description: Output directory for terasort
  fields:
  - jobs['terasort'].hadoopJob.args[2]
  name: SORT_OUT
  validation:
    regex:
      regexes:
      - hdfs:///.*

דוגמה 2: תבנית של תהליך עבודה עם בורר אשכולות

הקוד הבא הוא קובץ YAML לדוגמה של תבנית teragen-terasort עם פרמטרים של תהליך עבודה לבחירת אשכול, עם שלושה פרמטרים מוגדרים: CLUSTER, ‏ NUM_ROWS ו-OUTPUT_DIR.

placement:
  clusterSelector:
    clusterLabels:
      goog-dataproc-cluster-name: 'to-be-determined'
jobs:
  - stepId: teragen
    hadoopJob:
      args:
      - 'teragen'
      - 'tbd number of rows'
      - 'tbd output directory'
parameters:
- name: CLUSTER
  fields:
  - placement.clusterSelector.clusterLabels['goog-dataproc-cluster-name']
- name: NUM_ROWS
  fields:
  - jobs['teragen'].hadoopJob.args[1]
- name: OUTPUT_DIR
  fields:
  - jobs['teragen'].hadoopJob.args[2]

אחרי שיוצרים או עורכים קובץ YAML שמגדיר תבנית של תהליך עבודה עם פרמטרים של תבנית, משתמשים בפקודת gcloud הבאה כדי לייבא את קובץ ה-YAML וליצור או לעדכן את התבנית עם הפרמטרים.

gcloud dataproc workflow-templates import template-ID or template-name \
    --region=region \
    --source=template.yaml

אפשר להעביר לפקודה את WorkflowTemplate id או את משאב התבנית המלא name ("projects/projectId/regions/region/workflowTemplates/template_id"). אם קיים משאב תבנית עם אותו שם תבנית, הוא יוחלף (יעודכן) ומספר הגרסה שלו יגדל. אם אין תבנית עם אותו שם, המערכת תיצור תבנית חדשה.

‫API בארכיטקטורת REST

אפשר להגדיר פרמטר אחד או יותר של WorkflowTemplate.parameters בבקשת API של workflowTemplates.create או של workflowTemplates.update.

הדוגמה הבאה היא בקשת workflowTemplates.create ליצירת תבנית של תהליך עבודה מסוג teragen-terasort עם ארבעה פרמטרים מוגדרים: CLUSTER,‏ NUM_ROWS,‏ GEN_OUT ו-SORT_OUT.

POST https://dataproc.googleapis.com/v1/projects/my-project/locations/us-central1/workflowTemplates
{
  "id": "my-template",
  "jobs": [
    {
      "stepId": "teragen",
      "hadoopJob": {
        "mainJarFileUri": "file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar",
        "args": [
          "teragen",
          "10000",
          "hdfs:///gen/"
        ]
      }
    },
    {
      "stepId": "terasort",
      "prerequisiteStepIds": [
        "teragen"
      ],
      "hadoopJob": {
        "mainJarFileUri": "file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar",
        "args": [
          "terasort",
          "hdfs:///gen/",
          "hdfs:///sort/"
        ]
      }
    }
  ],
  "parameters": [
    {
      "name": "CLUSTER",
      "fields": [
        "placement.managedCluster.clusterName"
      ],
      "description": "The managed cluster name prefix"
    },
    {
      "name": "NUM_ROWS",
      "fields": [
        "jobs['teragen'].hadoopJob.args[1]"
      ],
      "description": "The number of rows to generate",
      "validation": {
        "values": {
          "values": [
            "1000",
            "10000",
            "100000"
          ]
        }
      }
    },
    {
      "name": "GEN_OUT",
      "fields": [
        "jobs['teragen'].hadoopJob.args[2]",
        "jobs['terasort'].hadoopJob.args[1]"
      ],
      "description": "Output directory for teragen",
      "validation": {
        "regex": {
          "regexes": [
            "hdfs:///.*"
          ]
        }
      }
    },
    {
      "name": "SORT_OUT",
      "fields": [
        "jobs['terasort'].hadoopJob.args[2]"
      ],
      "description": "Output directory for terasort",
      "validation": {
        "regex": {
          "regexes": [
            "hdfs:///.*"
          ]
        }
      }
    }
  ],
  "placement": {
    "managedCluster": {
      "clusterName": "to-be-determined",
      "config": {
        "gceClusterConfig": {
          "zoneUri": "us-central1-a"
        }
      }
    }
  }
}

העברת פרמטרים לתבנית עם פרמטרים

בכל פעם שמריצים תבנית של תהליך עבודה עם פרמטרים, אפשר להעביר קבוצה שונה של ערכי פרמטרים. צריך לספק ערך לכל פרמטר שמוגדר בתבנית.

פקודת gcloud

אפשר להעביר מפה של שמות פרמטרים לערכים לפקודה gcloud dataproc workflow-templates instantiate באמצעות הדגל --parameters. צריך לספק את כל ערכי הפרמטרים שמוגדרים בתבנית. הערכים שצוינו יחליפו את הערכים שצוינו בתבנית.

דוגמה לתבנית של אשכול מנוהל עם פרמטרים

gcloud dataproc workflow-templates instantiate my-template \
    --region=region \
    --parameters=CLUSTER=cluster,NUM_ROWS=1000,GEN_OUT=hdfs:///gen_20180601/,SORT_OUT=hdfs:///sort_20180601

דוגמה לתבנית של בורר אשכולות עם פרמטרים

gcloud dataproc workflow-templates instantiate \
  --parameters CLUSTER=my-cluster,NUM_ROWS=10000,OUTPUT_DIR=hdfs://some/dir
    

‫API בארכיטקטורת REST

אפשר להעביר מפה של parameters עם פרמטרים של names ל-values ל-API‏ workflowTemplates.instantiate של Managed Service for Apache Spark. צריך לספק את כל ערכי הפרמטרים שמוגדרים בתבנית. הערכים שסופקו יחליפו את הערכים שצוינו בתבנית.

לדוגמה:

POST https://dataproc.googleapis.com/v1/projects/my-project/regions/us-central1/workflowTemplates/my-template:instantiate
{
  "parameters": {
    "CLUSTER": "clusterA",
    "NUM_ROWS": "1000",
    "GEN_OUT": "hdfs:///gen_20180601/",
    "SORT_OUT": "hdfs:///sort_20180601/"
  }
}