תבנית Datastream ל-Spanner

התבנית Datastream to Spanner היא פייפליין זורם שקורא אירועים של Datastream מקטגוריה של Cloud Storage וכותב אותם במסד נתונים של Spanner. הוא מיועד להעברת נתונים ממקורות Datastream ל-Spanner. מציינים את הפרמטר gcsPubSubSubscription כדי לקרוא נתונים מהתראות Pub/Sub, או את הפרמטר inputFilePattern כדי לקרוא נתונים ישירות מקבצים ב-Cloud Storage.

כל הטבלאות שנדרשות להעברה צריכות להיות קיימות במסד הנתונים של Spanner ביעד לפני הפעלת התבנית. לכן, צריך להשלים את העברת הסכימה ממסד נתונים של מקור ל-Spanner של היעד לפני העברת הנתונים. יכול להיות שיהיו נתונים בטבלאות לפני ההעברה. התבנית הזו לא מעבירה שינויים בסכימה של Datastream למסד הנתונים של Spanner.

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

כל השגיאות שמתרחשות במהלך הפעולה, כמו חוסר התאמה בין סכימות, קובצי JSON פגומים או שגיאות שנובעות מהפעלת טרנספורמציות, מתועדות בתור שגיאות. תור השגיאות הוא תיקייה ב-Cloud Storage שבה מאוחסנים כל האירועים של Datastream שנתקלו בשגיאות, יחד עם סיבת השגיאה בפורמט טקסט. השגיאות יכולות להיות זמניות או קבועות, והן מאוחסנות בתורים של שגיאות בתיקיות המתאימות ב-Cloud Storage. המערכת מנסה לתקן שגיאות חולפות באופן אוטומטי, אבל לא שגיאות קבועות. אם יש שגיאות קבועות, אפשר לתקן את אירועי השינוי ולהעביר אותם לקטגוריה של ניסיון חוזר בזמן שהתבנית פועלת.

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

  • סטרימינג של Datastream במצב Running או Not started.
  • קטגוריה של Cloud Storage שבה מתבצעת שכפול של אירועים מ-Datastream.
  • מסד נתונים של Spanner עם טבלאות קיימות. הטבלאות האלה יכולות להיות ריקות או להכיל נתונים.

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

פרמטרים נדרשים

  • ‫instanceId: מכונת Spanner שבה השינויים משוכפלים.
  • ‫databaseId: מסד הנתונים של Spanner שבו השינויים משוכפלים.

פרמטרים אופציונליים

  • ‫inputFilePattern: מיקום הקובץ ב-Cloud Storage שמכיל את קובצי Datastream שרוצים לשכפל. בדרך כלל, זהו נתיב הבסיס של הסטרימינג. התמיכה בתכונה הזו הושבתה. מומלץ להשתמש בתכונה הזו רק כדי לנסות שוב להוסיף רשומות שמגיעות לתור הודעות מתות (DLQ) חמור.
  • ‫inputFileFormat: הפורמט של קובץ הפלט שנוצר על ידי Datastream. לדוגמה avro,json. ברירת המחדל היא avro.
  • ‫sessionFilePath: נתיב קובץ הסשן ב-Cloud Storage שמכיל מידע על מיפוי מ-HarbourBridge.
  • ‫projectId: מזהה הפרויקט ב-Spanner.
  • ‫spannerHost: נקודת הקצה של Cloud Spanner שאליה מתבצעת הקריאה בתבנית. לדוגמה, https://batch-spanner.googleapis.com. ברירת המחדל: https://batch-spanner.googleapis.com.
  • ‫gcsPubSubSubscription: מינוי Pub/Sub שנעשה בו שימוש במדיניות התראות של Cloud Storage. לשם, משתמשים בפורמט projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_NAME>.
  • ‫streamName: השם או התבנית של מקור הנתונים שרוצים לדגום כדי לקבל מידע על הסכימה וסוג המקור.
  • ‫shadowTablePrefix: הקידומת שמשמשת למתן שמות לטבלאות הצל. ברירת המחדל: shadow_.
  • ‫shouldCreateShadowTables: הדגל הזה מציין אם צריך ליצור טבלאות צל במסד הנתונים של Cloud Spanner. ברירת המחדל: true.
  • ‫rfcStartDateTime: התאריך והשעה שמשמשים לאחזור מ-Cloud Storage ‏ (https://tools.ietf.org/html/rfc3339). ברירת המחדל היא: 1970-01-01T00:00:00.00Z.
  • ‫fileReadConcurrency: מספר הקבצים לקריאה בו-זמנית ב-DataStream. ברירת המחדל היא 30.
  • ‫deadLetterQueueDirectory: נתיב הקובץ שמשמש לאחסון הפלט של תור השגיאות. נתיב ברירת המחדל של הקובץ הוא ספרייה במיקום הזמני של משימת Dataflow.
  • ‫dlqRetryMinutes: מספר הדקות בין ניסיונות חוזרים של תור הודעות שלא ניתן למסור. ברירת המחדל היא 10.
  • ‫dlqMaxRetryCount: מספר הפעמים המקסימלי שאפשר לנסות שוב שגיאות זמניות דרך DLQ. ברירת המחדל היא 500.
  • ‫dataStreamRootUrl: כתובת ה-URL הבסיסית של Datastream API. ברירת המחדל: https://datastream.googleapis.com/.
  • ‫datastreamSourceType: סוג מסד הנתונים של המקור שאליו Datastream מתחבר. לדוגמה: mysql/oracle. צריך להגדיר את זה כשבודקים בלי Datastream שפועל בפועל.
  • ‫roundJsonDecimals: אם הדגל הזה מוגדר, המערכת מעגלת את הערכים העשרוניים בעמודות JSON למספר שאפשר לאחסן בלי לאבד דיוק. ברירת המחדל היא: false.
  • ‫runMode: זהו סוג מצב ההרצה. ברירת המחדל היא רגיל. משתמשים במצב retryDLQ כדי לעבד רק קבצים עם שגיאות חמורות במקביל לפייפליין של מיגרציה פעילה. משתמשים במצב retryAllDLQ רק כשהצינור הרגיל נעצר. במצב הזה מתבצע עיבוד של ספריות עם ניסיונות חוזרים ושל ספריות עם שגיאות חמורות. אל תריצו את retryAllDLQ במקביל לצינורות פעילים אחרים, כי זה יגרום לקונפליקטים.
  • ‫transformationContextFilePath: נתיב קובץ הקשר של הטרנספורמציה באחסון בענן שמשמש לאכלוס נתונים שמשמשים בטרנספורמציות שמתבצעות במהלך העברות. לדוגמה: מזהה הרסיס לשם מסד הנתונים כדי לזהות את מסד הנתונים שממנו הועברה שורה.
  • ‫directoryWatchDurationInMinutes: משך הזמן שבו צינור עיבוד הנתונים צריך להמשיך לדגום ספרייה ב-GCS. קובצי הפלט של Datastream מסודרים במבנה של ספרייה שמתאר את חותמת הזמן של האירוע, מקובצת לפי דקות. הערך של הפרמטר הזה צריך להיות בערך שווה לערך של העיכוב המקסימלי שיכול להתרחש בין אירוע שמתרחש במסד הנתונים של המקור לבין אותו אירוע שנכתב ב-GCS על ידי Datastream. אחוזון 99.9 = 10 דקות. ברירת המחדל היא 10.
  • ‫spannerPriority: עדיפות הבקשה לקריאות ל-Cloud Spanner. הערך חייב להיות אחד מהבאים: [HIGH,MEDIUM,LOW]. ברירת המחדל היא HIGH.
  • ‫dlqGcsPubSubSubscription: המינוי ל-Pub/Sub שמשמש במדיניות ההתראות של Cloud Storage לספריית הניסיונות החוזרים של DLQ, כשפועלים במצב רגיל. בשם, משתמשים בפורמט projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_NAME>. כשהיא מוגדרת, המערכת מתעלמת מ-deadLetterQueueDirectory ומ-dlqRetryMinutes.
  • ‫transformationJarPath: המיקום של קובץ ה-JAR בהתאמה אישית ב-Cloud Storage, שמכיל את לוגיקת ההמרה בהתאמה אישית לעיבוד רשומות בהעברה קדימה. ברירת המחדל היא ריק.
  • ‫transformationClassName: שם מחלקה שמוגדר במלואו וכולל את לוגיקת הטרנספורמציה בהתאמה אישית. זהו שדה חובה אם צוין transformationJarPath. ברירת המחדל היא ריק.
  • ‫transformationCustomParameters: מחרוזת שמכילה פרמטרים מותאמים אישית שיועברו למחלקת הטרנספורמציה המותאמת אישית. ברירת המחדל היא ריק.
  • ‫filteredEventsDirectory: זהו נתיב הקובץ לאחסון האירועים שסוננו באמצעות טרנספורמציה מותאמת אישית. ברירת המחדל היא ספרייה במיקום הזמני של משימת Dataflow. ערך ברירת המחדל מספיק ברוב המקרים.
  • ‫sourceConfigURL: נתיב Cloud Storage לקובץ תצורה של מחיצת Shard להעברות עם מחיצות Shard. הוא מצפה לקובץ HOCON או JSON. קובץ לדוגמה זמין ב-v2/datastream-to-spanner/src/test/resources/DatastreamToSpannerSingleDFShardedMigrationIT/sharding-config.conf במאגר. לדוגמה, gs://my-bucket/my-shard-config.conf. לדוגמה, gs://my-bucket/my-shard-config.conf.
  • ‫tableOverrides: אלה השינויים בשמות הטבלאות מהמקור ל-Spanner. הם כתובים בפורמט הבא: [{SourceTableName1, SpannerTableName1}, {SourceTableName2, SpannerTableName2}]בדוגמה הזו מוצג מיפוי של הטבלה Singers ל-Vocalists ושל הטבלה Albums ל-Records. לדוגמה, [{Singers, Vocalists}, {Albums, Records}]. ברירת המחדל היא ריק.
  • ‫columnOverrides: אלה השינויים בשמות העמודות מהמקור ל-Spanner. הם כתובים בפורמט הבא: [{SourceTableName1.SourceColumnName1, SourceTableName1.SpannerColumnName1}, {SourceTableName2.SourceColumnName1, SourceTableName2.SpannerColumnName1}]שימו לב ש-SourceTableName צריך להישאר זהה גם במקור וגם בצמד של Spanner. כדי לשנות את שמות הטבלאות, משתמשים ב-tableOverrides.בדוגמה מוצג מיפוי של SingerName ל-TalentName ושל AlbumName ל-RecordName בטבלאות Singers ו-Albums בהתאמה. לדוגמה, [{Singers.SingerName, Singers.TalentName}, {Albums.AlbumName, Albums.RecordName}]. ברירת המחדל היא ריק.
  • ‫schemaOverridesFilePath: קובץ שמציין את הטבלה ואת השמות החלופיים של העמודות מהמקור ל-Spanner. ברירת המחדל היא ריק.
  • ‫shadowTableSpannerInstanceId: מכונה נפרדת אופציונלית לטבלאות צל. אם לא מציינים, טבלאות הצללים ייווצרו במכונה הראשית. אם מציינים את המאפיין הזה, צריך לציין גם את shadowTableSpannerDatabaseId. ברירת המחדל היא ריק.
  • ‫shadowTableSpannerDatabaseId: מסד נתונים נפרד אופציונלי לטבלאות צל. אם לא מציינים, טבלאות הצללים ייווצרו במסד הנתונים הראשי. אם מציינים את הפרמטר הזה, צריך לציין גם את הפרמטר shadowTableSpannerInstanceId. ברירת המחדל היא ריק.
  • ‫failureInjectionParameter: פרמטר של החדרת כשלים. משמש לבדיקה בלבד. ברירת המחדל היא ריק.
  • ‫skipDirectoryName: רשומות שהמערכת דילגה עליהן במהלך ההעברה נכתבות בספרייה הזו. שם הספרייה שמוגדר כברירת מחדל הוא skip.

הפעלת התבנית

המסוף

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

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

  5. בתפריט הנפתח Dataflow template (תבנית Dataflow), בוחרים את התבנית Cloud Datastream to Spanner (מ-Cloud Datastream אל Spanner).
  6. בשדות הפרמטרים שמופיעים, מזינים את ערכי הפרמטרים.
  7. לוחצים על הפעלת העבודה.

gcloud

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

gcloud dataflow flex-template run JOB_NAME \
    --project=PROJECT_ID \
    --region=REGION_NAME \
    --template-file-gcs-location=gs://dataflow-templates/VERSION/flex/Cloud_Datastream_to_Spanner \
    --parameters \
inputFilePattern=GCS_FILE_PATH,\
streamName=STREAM_NAME,\
instanceId=CLOUDSPANNER_INSTANCE,\
databaseId=CLOUDSPANNER_DATABASE,\
deadLetterQueueDirectory=DLQ
  

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

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

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

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שאפשר למצוא מקוננת בתיקיית נתונים מתאריך ספציפי המתאימה בדלי – gs://dataflow-templates/
  • ‫GCS_FILE_PATH: הנתיב ב-Cloud Storage שמשמש לאחסון אירועים של Datastream. לדוגמה: gs://bucket/path/to/data/
  • ‫CLOUDSPANNER_INSTANCE: המכונה שלכם ב-Spanner.
  • ‫CLOUDSPANNER_DATABASE: מסד הנתונים של Spanner.
  • ‫DLQ: הנתיב ב-Cloud Storage לספריית תור השגיאות.

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/Cloud_Datastream_to_Spanner",
      "parameters": {
          "inputFilePattern": "GCS_FILE_PATH",
          "streamName": "STREAM_NAME"
          "instanceId": "CLOUDSPANNER_INSTANCE"
          "databaseId": "CLOUDSPANNER_DATABASE"
          "deadLetterQueueDirectory": "DLQ"
      }
   }
}
  

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

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

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

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בקטגוריה – gs://dataflow-templates/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שנמצאת בתיקיית הנתונים מתאריך ספציפי בקטגוריה – gs://dataflow-templates/
  • ‫GCS_FILE_PATH: הנתיב ב-Cloud Storage שמשמש לאחסון אירועים של Datastream. לדוגמה: gs://bucket/path/to/data/
  • ‫CLOUDSPANNER_INSTANCE: המכונה שלכם ב-Spanner.
  • ‫CLOUDSPANNER_DATABASE: מסד הנתונים של Spanner.
  • ‫DLQ: הנתיב ב-Cloud Storage לספריית תור השגיאות.

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