תבנית של פונקציה מוגדרת על ידי המשתמש (UDF) ב-Python להעברה מ-Pub/Sub Proto ל-BigQuery

התבנית Pub/Sub proto to BigQuery היא פייפליין זורם, שמעביר נתוני פרוטוקול ממינוי Pub/Sub לטבלה ב-BigQuery. כל שגיאה שמתרחשת במהלך הכתיבה בטבלה ב-BigQuery מועברת לנושא לא מעובד ב-Pub/Sub.

אפשר לספק פונקציה בהגדרת המשתמש (UDF) ב-Python כדי לשנות את הנתונים. אפשר לשלוח שגיאות שמתרחשות במהלך הפעלת ה-UDF לנושא נפרד ב-Pub/Sub או לאותו נושא של הודעות שלא עובדו כמו השגיאות ב-BigQuery.

לפני שמריצים צינור עיבוד נתונים של Dataflow בתרחיש הזה, כדאי לבדוק אם מינוי Pub/Sub ל-BigQuery עם UDF עונה על הדרישות שלכם.

דרישות לגבי צינור עיבוד הנתונים

  • המינוי ל-Pub/Sub חייב להיות קיים.
  • קובץ הסכימה של רשומות ה-Proto צריך להיות ב-Cloud Storage.
  • נושא הפלט ב-Pub/Sub חייב להיות קיים.
  • מערך הנתונים של הפלט ב-BigQuery חייב להיות קיים.
  • אם הטבלה ב-BigQuery קיימת, חייבת להיות לה סכימה שתואמת לנתוני הפרוטו, בלי קשר לערך של createDisposition.

פרמטרים של תבניות

פרמטר תיאור
protoSchemaPath המיקום ב-Cloud Storage של קובץ הסכימה העצמאי של הפרוטוקול. לדוגמה, gs://path/to/my/file.pb. אפשר ליצור את הקובץ הזה באמצעות הדגל --descriptor_set_out של הפקודה protoc. הדגל --include_imports מבטיח שהקובץ יהיה עצמאי.
fullMessageName השם המלא של הודעת הפרוטוקול. לדוגמה, package.name.MessageName, כאשר package.name הוא הערך שסופק להצהרה package ולא להצהרה java_package.
inputSubscription המינוי לקלט Pub/Sub שממנו קוראים. לדוגמה, projects/<project>/subscriptions/<subscription>.
outputTopic נושא Pub/Sub שבו משתמשים לרשומות שלא עברו עיבוד. לדוגמה, projects/<project-id>/topics/<topic-name>.
outputTableSpec המיקום של טבלת הפלט ב-BigQuery. לדוגמה, my-project:my_dataset.my_table. בהתאם לערך של createDisposition שצוין, יכול להיות שטבלת הפלט תיווצר באופן אוטומטי באמצעות קובץ הסכימה של הקלט.
preserveProtoFieldNames אופציונלי: true כדי לשמור על השם המקורי של שדה Proto ב-JSON. false כדי להשתמש בשמות JSON סטנדרטיים יותר. לדוגמה, false ישנה את field_name ל-fieldName. (ברירת המחדל: false)
bigQueryTableSchemaPath אופציונלי: נתיב של Cloud Storage לנתיב של סכימת BigQuery. לדוגמה, gs://path/to/my/schema.json. אם לא מציינים את הסכימה, היא נגזרת מהסכימה של Proto.
pythonExternalTextTransformGcsPath אופציונלי: ה-URI של Cloud Storage של קובץ הקוד ב-Python שמגדיר את הפונקציה בהגדרת המשתמש (UDF) שבה רוצים להשתמש. לדוגמה, gs://my-bucket/my-udfs/my_file.py.
pythonExternalTextTransformFunctionName אופציונלי: השם של הפונקציה בהגדרת המשתמש (UDF) ב-Python שבה רוצים להשתמש.
udfOutputTopic אופציונלי: נושא Pub/Sub שבו מאוחסנות השגיאות של ה-UDF. לדוגמה, projects/<project-id>/topics/<topic-name>. אם לא מציינים נושא, שגיאות UDF נשלחות לאותו נושא כמו outputTopic.
writeDisposition אופציונלי: WriteDisposition של BigQuery. לדוגמה, WRITE_APPEND, WRITE_EMPTY או WRITE_TRUNCATE. ברירת המחדל: WRITE_APPEND.
createDisposition אופציונלי: CreateDisposition של BigQuery. לדוגמה, CREATE_IF_NEEDED, CREATE_NEVER. ברירת המחדל: CREATE_IF_NEEDED.
useStorageWriteApi אופציונלי: אם true, צינור עיבוד הנתונים משתמש ב-BigQuery Storage Write API (gRPC). ערך ברירת המחדל הוא false. מידע נוסף מופיע במאמר שימוש ב-Storage Write API ‏(gRPC).
useStorageWriteApiAtLeastOnce אופציונלי: כשמשתמשים ב-Storage Write API ‏(gRPC), מציינים את הסמנטיקה של הכתיבה. כדי להשתמש בסמנטיקה של לפחות פעם אחת, צריך להגדיר את הפרמטר הזה לערך true. כדי להשתמש בסמנטיקה של פעם אחת בדיוק, מגדירים את הפרמטר לערך false. הפרמטר הזה רלוונטי רק כש-useStorageWriteApi הוא true. ערך ברירת המחדל הוא false.
numStorageWriteApiStreams אופציונלי: כשמשתמשים ב-Storage Write API ‏(gRPC), מציינים את מספר ה-write streams. אם הערך של useStorageWriteApi הוא true והערך של useStorageWriteApiAtLeastOnce הוא false, צריך להגדיר את הפרמטר הזה.
storageWriteApiTriggeringFrequencySec אופציונלי: כשמשתמשים ב-Storage Write API‏ (gRPC), מציינים את תדירות ההפעלה בשניות. אם הערך של useStorageWriteApi הוא true והערך של useStorageWriteApiAtLeastOnce הוא false, צריך להגדיר את הפרמטר הזה.

פונקציה בהגדרת המשתמש (UDF)

אם רוצים, אפשר להרחיב את התבנית הזו על ידי כתיבת פונקציה בהגדרת המשתמש (UDF). התבנית קוראת ל-UDF עבור כל רכיב קלט. המטענים הייעודיים של הרכיבים עוברים סריאליזציה למחרוזות JSON. מידע נוסף זמין במאמר יצירת פונקציות בהגדרת המשתמש (UDF) לתבניות Dataflow.

מפרט הפונקציה

המפרט של ה-UDF הוא:

  • קלט: שדה הנתונים של הודעת Pub/Sub, שעבר סריאליזציה כמחרוזת JSON.
  • פלט: מחרוזת JSON שתואמת לסכימה של טבלת היעד ב-BigQuery.
  • הפעלת התבנית

    המסוף

    1. נכנסים לדף Create job from template ב-Dataflow.
    2. כניסה לדף Create job from template
    3. בשדה Job name, מזינים שם ייחודי למשימה.
    4. אופציונלי: בשדה Regional endpoint, בוחרים ערך מהתפריט הנפתח. אזור ברירת המחדל הוא us-central1.

      רשימה של אזורים שבהם אפשר להריץ משימת Dataflow מופיעה במאמר מיקומי Dataflow.

    5. בתפריט הנפתח Dataflow template, בוחרים את התבנית Pub/Sub Proto to BigQuery with Python UDF.
    6. בשדות הפרמטרים שמופיעים, מזינים את ערכי הפרמטרים.
    7. לוחצים על Run job.

    gcloud

    במעטפת או בטרמינל, מריצים את התבנית:

    gcloud dataflow flex-template run JOB_NAME \
        --region=REGION_NAME \
        --template-file-gcs-location=gs://dataflow-templates/VERSION/flex/PubSub_Proto_to_BigQuery_Xlang \
        --parameters \
    schemaPath=SCHEMA_PATH,\
    fullMessageName=PROTO_MESSAGE_NAME,\
    inputSubscription=SUBSCRIPTION_NAME,\
    outputTableSpec=BIGQUERY_TABLE,\
    outputTopic=UNPROCESSED_TOPIC
      

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫JOB_NAME: שם ייחודי למשימה, לפי בחירתכם
    • ‫REGION_NAME: האזור שבו רוצים לפרוס את משימת Dataflow, לדוגמה us-central1
    • ‫VERSION: גרסת התבנית שבה רוצים להשתמש

      אפשר להשתמש בערכים הבאים:

      • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
      • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שנמצאת בתיקיית הנתונים מתאריך ספציפי בקטגוריה – gs://dataflow-templates/
    • ‫SCHEMA_PATH: הנתיב ב-Cloud Storage לקובץ הסכימה של Proto (לדוגמה, gs://MyBucket/file.pb)
    • ‫PROTO_MESSAGE_NAME: שם ההודעה ב-Proto (לדוגמה, package.name.MessageName)
    • ‫SUBSCRIPTION_NAME: שם המינוי לקלט של Pub/Sub
    • ‫BIGQUERY_TABLE: השם של טבלת הפלט ב-BigQuery
    • ‫UNPROCESSED_TOPIC: נושא Pub/Sub שבו משתמשים לתור של ההודעות שלא עובדו

    API

    כדי להריץ את התבנית באמצעות ה-API ל-REST, שולחים בקשת HTTP POST. למידע נוסף על ה-API ועל היקפי ההרשאות שלו, קראו את המאמר projects.templates.launch.

    POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/flexTemplates:launch
    {
       "launch_parameter": {
          "jobName": "JOB_NAME",
          "containerSpecGcsPath": "gs://dataflow-templates/VERSION/flex/PubSub_Proto_to_BigQuery_Xlang",
          "parameters": {
              "schemaPath": "SCHEMA_PATH",
              "fullMessageName": "PROTO_MESSAGE_NAME",
              "inputSubscription": "SUBSCRIPTION_NAME",
              "outputTableSpec": "BIGQUERY_TABLE",
              "outputTopic": "UNPROCESSED_TOPIC"
          }
       }
    }
      

    מחליפים את מה שכתוב בשדות הבאים:

    • ‫PROJECT_ID: Google Cloud מזהה הפרויקט שבו רוצים להריץ את משימת Dataflow
    • ‫JOB_NAME: שם ייחודי למשימה, לפי בחירתכם
    • ‫LOCATION: האזור שבו רוצים לפרוס את משימת Dataflow, לדוגמה us-central1
    • ‫VERSION: גרסת התבנית שבה רוצים להשתמש

      אפשר להשתמש בערכים הבאים:

      • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
      • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שנמצאת בתיקיית הנתונים מתאריך ספציפי בקטגוריה – gs://dataflow-templates/
    • ‫SCHEMA_PATH: הנתיב ב-Cloud Storage לקובץ הסכימה של Proto (לדוגמה, gs://MyBucket/file.pb)
    • ‫PROTO_MESSAGE_NAME: שם ההודעה ב-Proto (לדוגמה, package.name.MessageName)
    • ‫SUBSCRIPTION_NAME: שם המינוי לקלט של Pub/Sub
    • ‫BIGQUERY_TABLE: השם של טבלת הפלט ב-BigQuery
    • ‫UNPROCESSED_TOPIC: נושא Pub/Sub שבו משתמשים לתור של ההודעות שלא עובדו

    המאמרים הבאים