תבנית Java Database Connectivity ‏ (JDBC) ל-BigQuery

תבנית ה-JDBC ל-BigQuery היא צינור (pipeline) של אצווה שמעתיק נתונים מטבלת מסד נתונים יחסי לטבלה קיימת ב-BigQuery. הצינור הזה משתמש ב-JDBC כדי להתחבר למסד הנתונים הרלציוני. אפשר להשתמש בתבנית הזו כדי להעתיק נתונים מכל מסד נתונים רלציוני עם מנהלי התקנים זמינים של JDBC אל BigQuery.

כדי להוסיף עוד שכבת הגנה, אפשר להעביר מפתח Cloud KMS, יחד עם פרמטרים של שם משתמש, סיסמה ומחרוזת חיבור בהצפנת Base64, שמוצפנים באמצעות מפתח Cloud KMS. פרטים נוספים על הצפנה של שם המשתמש, הסיסמה והפרמטרים של מחרוזת החיבור זמינים במאמר נקודת הקצה של הצפנת Cloud KMS API.

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

  • מנהלי ההתקנים של JDBC למסד הנתונים הרלציוני צריכים להיות זמינים.
  • הטבלה ב-BigQuery צריכה להתקיים לפני הפעלת צינור הנתונים.
  • לטבלה ב-BigQuery צריכה להיות סכימה תואמת.
  • צריכה להיות גישה למסד הנתונים הרלציוני מרשת המשנה שבה פועל Dataflow.

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

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

  • driverJars: רשימה מופרדת בפסיקים של קובצי JAR של מנהלי התקנים. לדוגמה, gs://your-bucket/driver_jar1.jar,gs://your-bucket/driver_jar2.jar.
  • driverClassName: שם המחלקה של מנהל ההתקן של JDBC. לדוגמה, com.mysql.jdbc.Driver.
  • connectionURL: מחרוזת כתובת ה-URL של חיבור JDBC. לדוגמה, jdbc:mysql://some-host:3306/sampledb. אפשר להעביר את הערך הזה כמחרוזת שמוצפנת באמצעות מפתח Cloud KMS ואז מקודדת ב-Base64. מסירים את התווים של הרווחים מהמחרוזת שמקודדת ב-Base64. שימו לב להבדל בין מחרוזת חיבור למסד נתונים של Oracle שאינו RAC‏ (jdbc:oracle:thin:@some-host:<port>:<sid>) לבין מחרוזת חיבור למסד נתונים של Oracle RAC‏ (jdbc:oracle:thin:@//some-host[:<port>]/<service_name>). לדוגמה, jdbc:mysql://some-host:3306/sampledb.
  • outputTable: המיקום של טבלת הפלט ב-BigQuery. לדוגמה, <PROJECT_ID>:<DATASET_NAME>.<TABLE_NAME>.
  • bigQueryLoadingTemporaryDirectory: ספריית הזמנית לתהליך הטעינה של BigQuery. לדוגמה, gs://your-bucket/your-files/temp_dir.

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

  • connectionProperties: מחרוזת המאפיינים לשימוש בחיבור JDBC. הפורמט של המחרוזת צריך להיות [propertyName=property;]*.מידע נוסף זמין במאמר Configuration Properties (מאפייני הגדרה) (https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html) במסמכי העזרה של MySQL. לדוגמה, unicode=true;characterEncoding=UTF-8.
  • username: שם המשתמש שבו יש להשתמש לחיבור JDBC. אפשר להעביר אותו כמחרוזת מוצפנת באמצעות מפתח Cloud KMS, או כסוד של Secret Manager בפורמט projects/{project}/secrets/{secret}/versions/{secret_version}.
  • password: הסיסמה לשימוש בחיבור JDBC. אפשר להעביר אותו כמחרוזת מוצפנת באמצעות מפתח Cloud KMS, או כסוד של Secret Manager בפורמט projects/{project}/secrets/{secret}/versions/{secret_version}.
  • query: השאילתה להרצה במקור כדי לחלץ את הנתונים. שימו לב: יש הבדלים בין חלק מהסוגים של JDBC SQL ו-BigQuery, למרות שהשמות שלהם זהים. כמה מיפויי סוגים חשובים של SQL -> BigQuery שכדאי לזכור הם DATETIME --> TIMESTAMP. יכול להיות שיהיה צורך בהמרת טיפוסים אם הסכימות לא זהות. לדוגמה, select * from sampledb.sample_table.
  • KMSEncryptionKey: מפתח ההצפנה של Cloud KMS שבו יש להשתמש כדי לפענח את שם המשתמש, הסיסמה ומחרוזת החיבור. אם מעבירים מפתח Cloud KMS, צריך גם להצפין את שם המשתמש, הסיסמה ומחרוזת החיבור. לדוגמה, projects/your-project/locations/global/keyRings/your-keyring/cryptoKeys/your-key.
  • useColumnAlias: אם המאפיין הזה מוגדר לערך true, צינור הנתונים משתמש בכינוי העמודה (AS) במקום בשם העמודה כדי למפות את השורות ל-BigQuery. ברירת המחדל היא false.
  • isTruncate: אם הערך מוגדר ל-true, צינור העברת הנתונים חותך את הנתונים לפני הטעינה שלהם ל-BigQuery. ברירת המחדל היא false, שגורמת לצינור לצרף נתונים.
  • partitionColumn: אם מציינים את partitionColumn יחד עם table, ‏ JdbcIO קורא את הטבלה במקביל על ידי הפעלת כמה מופעים של השאילתה באותה טבלה (תת-שאילתה) באמצעות טווחים. בשלב הזה יש תמיכה בעמודות של מחיצות Long ו-DateTime. העברת סוג העמודה דרך partitionColumnType.
  • partitionColumnType: הסוג של partitionColumn. הערכים האפשריים הם long או datetime. ברירת המחדל היא: long.
  • table: הטבלה שממנה מתבצעת הקריאה כשמשתמשים במחיצות. הפרמטר הזה מקבל גם שאילתת משנה בסוגריים. לדוגמה, (select id, name from Person) as subq.
  • numPartitions: מספר המחיצות. הערך הזה, יחד עם הגבול התחתון והגבול העליון, יוצר צעדים של מחיצות לביטויי פסקה WHERE שנוצרים ומשמשים לפיצול שווה של עמודת המחיצות. אם הקלט קטן מ-1, המספר מוגדר כ-1.
  • lowerBound: הגבול התחתון לשימוש בסכמת המחיצות. אם לא מציינים ערך, Apache Beam מסיק אותו באופן אוטומטי עבור הסוגים הנתמכים. המאפיין datetime partitionColumnType מקבל את הגבול התחתון בפורמט yyyy-MM-dd HH:mm:ss.SSSZ. לדוגמה, 2024-02-20 07:55:45.000+03:30.
  • upperBound: הגבול העליון לשימוש בסכמת החלוקה. אם לא מציינים ערך, Apache Beam מסיק אותו באופן אוטומטי עבור הסוגים הנתמכים. ‫datetime partitionColumnType מקבל גבול עליון בפורמט yyyy-MM-dd HH:mm:ss.SSSZ. לדוגמה, 2024-02-20 07:55:45.000+03:30.
  • fetchSize: מספר השורות שיש לאחזר ממסד הנתונים בכל פעם. לא משמש לקריאות מחולקות. ברירת המחדל היא 50,000.
  • createDisposition: הגדרת BigQuery CreateDisposition לשימוש. לדוגמה, CREATE_IF_NEEDED או CREATE_NEVER. ברירת המחדל היא: CREATE_NEVER.
  • bigQuerySchemaPath: נתיב Cloud Storage של סכימת ה-JSON של BigQuery. אם המדיניות createDisposition מוגדרת לערך CREATE_IF_NEEDED, חובה לציין את הפרמטר הזה. לדוגמה, gs://your-bucket/your-schema.json.
  • outputDeadletterTable: הטבלה ב-BigQuery שבה יישמרו הודעות שלא הצליחו להגיע לטבלת הפלט, בפורמט "PROJECT_ID:DATASET_NAME.TABLE_NAME". אם הטבלה לא קיימת, היא נוצרת כשהצינור מופעל. אם לא מציינים את הפרמטר הזה, הצינור ייכשל אם יתרחשו שגיאות כתיבה.אפשר לציין את הפרמטר הזה רק אם הפרמטר useStorageWriteApi או useStorageWriteApiAtLeastOnce מוגדר כ-True.
  • disabledAlgorithms: אלגוריתמים שמופרדים בפסיקים וצריך להשבית. אם הערך הזה מוגדר כ-none, אף אלגוריתם לא מושבת. חשוב להשתמש בפרמטר הזה בזהירות, כי יכול להיות שיש אלגוריתמים שמושבתים כברירת מחדל בגלל פגיעויות או בעיות בביצועים. לדוגמה, SSLv3, RC4.
  • extraFilesToStage: נתיבים ב-Cloud Storage או סודות ב-Secret Manager של קבצים להעברה זמנית לעובד, מופרדים בפסיקים. הקבצים האלה נשמרים בספרייה ‎ /extra_files בכל עובד. לדוגמה, gs://<BUCKET_NAME>/file.txt,projects/<PROJECT_ID>/secrets/<SECRET_ID>/versions/<VERSION_ID>.
  • useStorageWriteApi: אם הערך הוא true, צינור הנתונים משתמש ב-BigQuery Storage Write API‏ (https://cloud.google.com/bigquery/docs/write-api). ערך ברירת המחדל הוא false. מידע נוסף זמין במאמר בנושא שימוש ב-Storage Write API‏ (https://beam.apache.org/documentation/io/built-in/google-bigquery/#storage-write-api).
  • useStorageWriteApiAtLeastOnce: כשמשתמשים ב-Storage Write API, המאפיין הזה מציין את סמנטיקת הכתיבה. כדי להשתמש בסמנטיקה של 'לפחות פעם אחת' (https://beam.apache.org/documentation/io/built-in/google-bigquery/#at-least-once-semantics), מגדירים את הפרמטר הזה לערך true. כדי להשתמש בסמנטיקה של 'פעם אחת בדיוק', מגדירים את הפרמטר לערך false. הפרמטר הזה רלוונטי רק אם הערך של useStorageWriteApi הוא true. ערך ברירת המחדל הוא false.

הפעלת התבנית

המסוף

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

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

  5. בתפריט הנפתח Dataflow template (תבנית של העברת נתונים), בוחרים באפשרות the JDBC to BigQuery with BigQuery Storage API support template.
  6. בשדות הפרמטרים שמופיעים, מזינים את ערכי הפרמטרים.
  7. לוחצים על הפעלת העבודה.

gcloud

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

gcloud dataflow flex-template run JOB_NAME \
    --template-file-gcs-location=gs://dataflow-templates-REGION_NAME/VERSION/flex/Jdbc_to_BigQuery_Flex \
    --project=PROJECT_ID \
    --region=REGION_NAME \
    --parameters \
       driverJars=DRIVER_JARS,\
       driverClassName=DRIVER_CLASS_NAME,\
       connectionURL=CONNECTION_URL,\
       outputTable=OUTPUT_TABLE,\
       bigQueryLoadingTemporaryDirectory=BIG_QUERY_LOADING_TEMPORARY_DIRECTORY,\

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

  • JOB_NAME: שם ייחודי של המשימה לפי בחירתכם
  • VERSION: הגרסה של התבנית שבה רוצים להשתמש

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

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בדלי – gs://dataflow-templates-REGION_NAME/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שאפשר למצוא אותה בתיקיית האב המתאימה עם התאריך בדלי – gs://dataflow-templates-REGION_NAME/
  • REGION_NAME: האזור שבו רוצים לפרוס את עבודת Dataflow, לדוגמה: us-central1
  • DRIVER_JARS: נתיבי Cloud Storage של מנהלי התקנים של JDBC, מופרדים באמצעות פסיקים
  • DRIVER_CLASS_NAME: שם המחלקה של מנהל ההתקן של JDBC
  • CONNECTION_URL: מחרוזת כתובת ה-URL של חיבור JDBC.
  • OUTPUT_TABLE: טבלת הפלט ב-BigQuery
  • BIG_QUERY_LOADING_TEMPORARY_DIRECTORY: ספריית הזמנית לתהליך הטעינה של BigQuery

API

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

POST https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/LOCATION/flexTemplates:launch
{
   "launchParameter": {
     "jobName": "JOB_NAME",
     "parameters": {
       "driverJars": "DRIVER_JARS",
       "driverClassName": "DRIVER_CLASS_NAME",
       "connectionURL": "CONNECTION_URL",
       "outputTable": "OUTPUT_TABLE",
       "bigQueryLoadingTemporaryDirectory": "BIG_QUERY_LOADING_TEMPORARY_DIRECTORY",
     },
     "containerSpecGcsPath": "gs://dataflow-templates-LOCATION/VERSION/flex/Jdbc_to_BigQuery_Flex",
     "environment": { "maxWorkers": "10" }
  }
}

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

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

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

    • latest כדי להשתמש בגרסה העדכנית של התבנית, שזמינה בתיקיית ההורה ללא תאריך בדלי – gs://dataflow-templates-REGION_NAME/latest/
    • שם הגרסה, כמו 2023-09-12-00_RC00, כדי להשתמש בגרסה ספציפית של התבנית, שאפשר למצוא אותה בתיקיית האב המתאימה עם התאריך בדלי – gs://dataflow-templates-REGION_NAME/
  • LOCATION: האזור שבו רוצים לפרוס את עבודת Dataflow, לדוגמה: us-central1
  • DRIVER_JARS: נתיבי Cloud Storage של מנהלי התקנים של JDBC, מופרדים באמצעות פסיקים
  • DRIVER_CLASS_NAME: שם המחלקה של מנהל ההתקן של JDBC
  • CONNECTION_URL: מחרוזת כתובת ה-URL של חיבור JDBC.
  • OUTPUT_TABLE: טבלת הפלט ב-BigQuery
  • BIG_QUERY_LOADING_TEMPORARY_DIRECTORY: ספריית הזמנית לתהליך הטעינה של BigQuery

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