העברת נתונים מ-Databricks ל-Spanner באמצעות CSV

1. יצירת צינור עיבוד נתונים של reverse ETL מ-Databricks ל-Spanner באמצעות GCS ו-Dataflow

מבוא

בשיעור הזה תלמדו איך ליצור צינור עיבוד נתונים של Reverse ETL מ-Databricks ל-Spanner באמצעות קובצי CSV שמאוחסנים ב-Google Cloud Storage. באופן מסורתי, צינורות ETL (חילוץ, טרנספורמציה, טעינה) מעבירים נתונים ממסדי נתונים תפעוליים לתוך מחסן נתונים כמו Databricks לצורך ניתוח. צינור ETL הפוך עושה את הפעולה ההפוכה: הוא מעביר נתונים מעובדים ומסודרים מ מחסן הנתונים בחזרה למערכות תפעוליות, שבהן אפשר להשתמש בנתונים כדי להפעיל אפליקציות, לספק תכונות שפונות למשתמשים או לקבל החלטות בזמן אמת.

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

כדי לעשות את זה, משתמשים ב-Google Cloud Storage‏ (GCS) וב-Dataflow כשלבי ביניים. הנה פירוט של זרימת הנתונים וההיגיון מאחורי הארכיטקטורה הזו:

  1. Databricks ל-Google Cloud Storage‏ (GCS) בפורמט CSV:
  • השלב הראשון הוא לייצא את הנתונים מ-Databricks בפורמט פתוח ואוניברסלי. ייצוא ל-CSV היא שיטה נפוצה ופשוטה ליצירת קובצי נתונים ניידים. הקבצים האלה יועברו ל-GCS, שבו אפשר לאחסן אובייקטים בצורה עמידה וניתנת להרחבה.
  1. GCS ל-Spanner (באמצעות Dataflow):
  • במקום לכתוב סקריפט בהתאמה אישית כדי לקרוא מ-GCS ולכתוב ב-Spanner, נעשה שימוש ב-Google Dataflow, שירות לעיבוד נתונים בניהול מלא. ב-Dataflow יש תבניות מוכנות מראש שמתאימות במיוחד למשימה מהסוג הזה. השימוש בתבנית GCS Text to Cloud Spanner מאפשר ייבוא נתונים מקבילי עם תפוקה גבוהה, בלי לכתוב קוד לעיבוד נתונים, וכך חוסך זמן פיתוח משמעותי.

מה תלמדו

  • איך טוענים נתונים ל-Databricks
  • איך יוצרים קטגוריה ב-GCS
  • איך מייצאים טבלה של Databricks ל-GCS בפורמט CSV
  • איך מגדירים מופע Spanner
  • איך טוענים טבלאות CSV ל-Spanner באמצעות Dataflow

2. הגדרה, דרישות ומגבלות

דרישות מוקדמות

  • חשבון Databricks עם הרשאות ליצירת אשכולות ולהתקנת ספריות. חשבון עם תקופת ניסיון לא מספיק לתרגיל הזה.
  • חשבון Google Cloud עם ממשקי Spanner,‏ Cloud Storage ו-Dataflow API מופעלים.
  • גישה ל-Google Cloud Console דרך דפדפן אינטרנט.
  • טרמינל עם Google Cloud CLI מותקן.
  • אם המדיניות iam.allowedPolicyMemberDomains מופעלת בארגון שלכם ב-Google Cloud, יכול להיות שאדמין יצטרך להעניק חריגה כדי לאפשר חשבונות שירות מדומיינים חיצוניים. הנושא הזה יוסבר בשלב מאוחר יותר, אם הוא רלוונטי.

הרשאות IAM ב-Google Cloud Platform

כדי לבצע את כל השלבים ב-codelab הזה, לחשבון Google צריכות להיות ההרשאות הבאות.

חשבונות שירות

iam.serviceAccountKeys.create

מאפשרת יצירה של חשבונות שירות.

Spanner

spanner.instances.create

מאפשר ליצור מופע חדש של Spanner.

spanner.databases.create

מאפשר להריץ הצהרות DDL כדי ליצור

spanner.databases.updateDdl

מאפשר להריץ הצהרות DDL כדי ליצור טבלאות במסד הנתונים.

Google Cloud Storage

storage.buckets.create

מאפשר ליצור מאגר חדש ב-GCS לאחסון קובצי Parquet שיוצאו.

storage.objects.create

מאפשר לכתוב את קובצי Parquet המיוצאים לקטגוריית GCS.

storage.objects.get

מאפשר ל-BigQuery לקרוא את קובצי Parquet ממאגר GCS.

storage.objects.list

מאפשר ל-BigQuery להציג את קובצי Parquet בדלי GCS.

Dataflow

Dataflow.workitems.lease

מאפשרת לתבוע פריטי עבודה מ-Dataflow.

Dataflow.workitems.sendMessage

מאפשר לעובד של Dataflow לשלוח הודעות בחזרה לשירות Dataflow.

Logging.logEntries.create

מאפשר לעובדי Dataflow לכתוב רשומות ביומן ב-Google Cloud Logging.

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

roles/resourcemanager.projectIamAdmin

roles/iam.serviceAccountKeyAdmin

roles/spanner.instanceAdmin

roles/spanner.databaseAdmin

roles/storage.admin

roles/dataflow.serviceAgent

roles/dataflow.worker

roles/dataflow.serviceAgent

מגבלות

חשוב להיות מודעים להבדלים בסוגי הנתונים כשמעבירים נתונים בין מערכות.

  • Databricks ל-CSV: כשמייצאים, סוגי הנתונים של Databricks מומרים לייצוגים סטנדרטיים של טקסט.
  • ייבוא מ-CSV ל-Spanner: כשמייבאים נתונים, צריך לוודא שסוגי הנתונים של היעד ב-Spanner תואמים לייצוגי המחרוזות בקובץ ה-CSV. בשיעור ה-Lab הזה מוסבר על קבוצה נפוצה של מיפויי סוגים.

הגדרת מאפיינים לשימוש חוזר

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

  • ‫GCP_REGION – האזור הספציפי שבו ימוקמו המשאבים של GCP. כאן אפשר לראות את רשימת האזורים.
  • GCP_PROJECT – מזהה הפרויקט ב-GCP שבו רוצים להשתמש.
  • ‫GCP_BUCKET_NAME – שם קטגוריית GCS שתיצור, ושבה יאוחסנו קובצי הנתונים.
export GCP_REGION = <GCP REGION HERE> 
export GCP_PROJECT= <GCP PROJECT HERE>
export GCS_BUCKET_NAME = <GCS BUCKET NAME HERE>
export SPANNER_INSTANCE = <SPANNER INSTANCE ID HERE>
export SPANNER_DB = <SPANNER DATABASE ID HERE>

Databricks

בשיעור ה-Lab הזה, נשתמש בחשבון Databricks שמתארח ב-GCP כדי להגדיר מיקום נתונים חיצוני ב-GCS.

Google Cloud

כדי לבצע את המעבדה הזו, צריך פרויקט ב-Google Cloud.

פרויקט ב-Google Cloud

פרויקט הוא יחידה בסיסית של ארגון ב-Google Cloud. אם האדמין סיפק לכם קוד לשימוש, אתם יכולים לדלג על השלב הזה.

אפשר ליצור פרויקט באמצעות ה-CLI באופן הבא:

gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT

מידע נוסף על יצירה וניהול של פרויקטים

הגדרת Spanner

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

יצירת מכונה

gcloud spanner instances create $SPANNER_INSTANCE \
--config=regional-$GCP_REGION \
--description="Codelabs Snowflake RETL" \
--processing-units=100 \
--edition=ENTERPRISE

יצירת מסד הנתונים

gcloud spanner databases create $SPANNER_DB \
--instance=$SPANNER_INSTANCE

3. יצירת קטגוריה של Google Cloud Storage

‫Google Cloud Storage‏ (GCS) ישמש לאחסון זמני של קובצי הנתונים בפורמט CSV שנוצרו על ידי Snowflake, לפני שהם יובאו אל Spanner.

יצירת הקטגוריה

כדי ליצור קטגוריית אחסון באזור ספציפי, משתמשים בפקודה הבאה.

gcloud storage buckets create gs://$GCS_BUCKET_NAME --location=$GCP_REGION

אימות יצירת הקטגוריה

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

gcloud storage ls | grep gs://$GCS_BUCKET_NAME

בדיקת הרשאות כתיבה

השלב הזה מבטיח שהסביבה המקומית מאומתת בצורה נכונה ושיש לה את ההרשאות הנדרשות לכתיבת קבצים בקטגוריה החדשה שנוצרה.

echo "Hello, GCS" | gcloud storage cp - gs://$GCS_BUCKET_NAME/hello.txt

אימות הקובץ שהועלה

הצגת רשימה של האובייקטים בקטגוריה. הנתיב המלא של הקובץ שהועלה אמור להופיע.

gcloud storage ls gs://$GCS_BUCKET_NAME

הפלט הבא אמור להתקבל:

gs://$GCS_BUCKET_NAME/hello.txt

כדי לראות את התוכן של אובייקט בקטגוריה, אפשר להשתמש ב-gcloud storage cat.

gcloud storage cat gs://$GCS_BUCKET_NAME/hello.txt

התוכן של הקובץ צריך להיות גלוי:

Hello, GCS

ניקוי קובץ הבדיקה

הקטגוריה של Cloud Storage מוגדרת עכשיו. עכשיו אפשר למחוק את קובץ הבדיקה הזמני.

gcloud storage rm gs://$GCS_BUCKET_NAME/hello.txt

הפלט אמור לאשר את המחיקה:

Removing gs://$GCS_BUCKET_NAME/hello.txt...
/ [1 objects]
Operation completed over 1 objects.

4. ייצוא מ-Databricks ל-GCS

עכשיו, סביבת Databricks תוגדר כך שתתחבר ל-GCS בצורה מאובטחת ותייצא נתונים.

יצירת פרטי כניסה

  1. בתפריט הצד שמימין, לוחצים על קטלוג.
  2. לוחצים על נתונים חיצוניים אם האפשרות הזו זמינה בחלק העליון של דף הקטלוג. אחרת, לוחצים על התפריט הנפתח Connect (קישור) ואז על Credentials (פרטי כניסה).
  3. אם אתם לא בכרטיסייה Credentials, עוברים אליה.
  4. לוחצים על Create Credentials (יצירת פרטי כניסה).
  5. בוחרים באפשרות GCP Service Account בשדה סוג פרטי הכניסה
  6. מזינים codelabs-retl-credentials בשדה שם פרטי הכניסה
  7. לחץ על צור.
  8. מעתיקים את כתובת האימייל של חשבון השירות מתיבת הדו-שיח ולוחצים על סיום.

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

export GCP_SERVICE_ACCOUNT=<Your service account>

מתן הרשאות ל-GCS ב-Databricks

עכשיו צריך לתת לחשבון השירות של Snowflake הרשאה לכתוב בקטגוריה של GCS.

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.objectAdmin"

gcloud storage buckets add-iam-policy-binding gs://$GCS_BUCKET_NAME \
    --member="serviceAccount:$GCP_SERVICE_ACCOUNT" \
    --role="roles/storage.legacyBucketReader"

יצירת מיקום חיצוני

  1. חוזרים לדף Credentials (פרטי כניסה) באמצעות נתיב הניווט בחלק העליון של הדף.
  2. עוברים לכרטיסייה מיקום חיצוני.
  3. לוחצים על יצירת מיקום חיצוני.
  4. הגדרת שם המיקום החיצוני לערך codelabs-retl-gcs
  5. משאירים את סוג האחסון כ-GCP
  6. מגדירים את נתיב הדלי לכתובת ה-URL
  7. מגדירים את פרטי הכניסה לאחסון לערך codelabs-retl-credentials
  8. לחץ על צור.
  9. באישור. לחץ על צור.

יצירת קטלוג וסכימה

  1. בתפריט הצד שמימין, לוחצים על קטלוג.
  2. לוחצים על יצירה ואז על יצירת קטלוג.
  3. מגדירים את Catalog Name לערך retl_tpch_project
  4. מגדירים את הסוג לערך Standard
  5. בוחרים באפשרות codelabs-retl-gcs כמיקום חיצוני
  6. לחץ על צור.
  7. לוחצים על retl_tpch_project ברשימה Catalog.
  8. לוחצים על יצירת סכימה.
  9. מגדירים את שם הסכימה לערך tpch_data
  10. בוחרים באפשרות מיקום האחסון וקובעים את הערך codelabs-retl-gcs
  11. לחץ על צור.

ייצוא הנתונים כקובץ CSV

עכשיו הנתונים מוכנים לייצוא. נשתמש במערך הנתונים לדוגמה של TPC-H כדי להגדיר את הטבלה החדשה שתאוחסן חיצונית כקובץ CSV.

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

  1. בתפריט הימני, בקטע SQL, לוחצים על Queries (שאילתות).
  2. לוחצים על הלחצן יצירת שאילתה.
  3. לצד הלחצן הפעלה, מגדירים את סביבת העבודה ל-retl_tpch_project.
CREATE TABLE retl_tpch_project.tpch_data.regional_sales_csv
USING CSV
LOCATION 'gs://<Your bucket name>/regional_sales_csv'
OPTIONS (
  header "false",
  delimiter ","
)
AS
SELECT
    n.n_name AS nation_name,
    c.c_mktsegment AS market_segment,
    YEAR(o.o_orderdate) AS order_year,
    o.o_orderpriority AS order_priority,
    COUNT(o.o_orderkey) AS total_order_count,
    ROUND(SUM(o.o_totalprice), 2) AS total_revenue,
    COUNT(DISTINCT c.c_custkey) AS unique_customer_count
FROM samples.tpch.orders AS o
INNER JOIN samples.tpch.customer AS c
    ON o.o_custkey = c.c_custkey
INNER JOIN samples.tpch.nation AS n
    ON c.c_nationkey = n.n_nationkey
GROUP BY 1, 2, 3, 4;

אימות הנתונים ב-GCS

בודקים את קטגוריית GCS כדי לראות את הקבצים שנוצרו ב-Databricks.

gcloud storage ls gs://$GCS_BUCKET_NAME/regional_sales_csv/

אחד או יותר מהקבצים .csv אמורים להיות גלויים, יחד עם _SUCCESS וקבצי יומן.

5. טעינת נתונים ל-Spanner באמצעות Dataflow

תבנית Dataflow שסופקה על ידי Google תשמש לייבוא נתוני ה-CSV מ-GCS אל Spanner.

יצירת טבלת Spanner

קודם יוצרים את טבלת היעד ב-Spanner. הסכימה צריכה להיות תואמת לנתונים בקובצי ה-CSV.

gcloud spanner databases ddl update $SPANNER_DB \
  --instance=$SPANNER_INSTANCE \
  --ddl="$(cat <<EOF
CREATE TABLE regional_sales (
    nation_name STRING(MAX),
    market_segment STRING(MAX),
    order_year INT64,
    order_priority STRING(MAX),
    total_order_count INT64,
    total_revenue NUMERIC,
    unique_customer_count INT64
) PRIMARY KEY (nation_name, market_segment, order_year, order_priority);
EOF
)"

יצירת מניפסט של Dataflow

תבנית Dataflow דורשת קובץ 'מניפסט'. זהו קובץ JSON שמציין לתבנית איפה נמצאים קובצי נתוני המקור ובאיזו טבלת Spanner לטעון אותם.

מגדירים ומעלים קובץ חדש של regional_sales_manifest.json אל מאגר GCS:

cat <<EOF | gcloud storage cp - gs://$GCS_BUCKET_NAME/regional_sales_manifest.json 
{ 
  "tables": [
    {
       "table_name": "regional_sales", 
       "file_patterns": [ 
         "gs://$GCS_BUCKET_NAME/regional_sales_csv/*.csv"
       ] 
    } 
  ] 
} 
EOF

הפעלת Dataflow API

לפני שמשתמשים ב-Dataflow, צריך להפעיל אותו. איך עושים את זה

gcloud services enable dataflow.googleapis.com --project=$GCP_PROJECT

יצירה והרצה של משימת Dataflow

משימת הייבוא מוכנה להפעלה. הפקודה הזו מפעילה משימת Dataflow באמצעות התבנית GCS_Text_to_Cloud_Spanner.

הפקודה ארוכה ויש לה כמה פרמטרים. הנה פירוט:

  • --gcs-location: הנתיב לתבנית המוכנה מראש ב-GCS.
  • --region: האזור שבו תפעל משימת Dataflow.
  • --parameters: רשימה של צמדי מפתח/ערך שספציפיים לתבנית:
  • instanceId, databaseId: מכונת היעד ומסד הנתונים ב-Spanner.
  • importManifest: הנתיב ב-GCS לקובץ המניפסט שנוצר.
gcloud dataflow jobs run spanner-import-from-gcs \
  --gcs-location=gs://dataflow-templates/latest/GCS_Text_to_Cloud_Spanner \
  --region=$GCP_REGION \
  --staging-location=gs://$GCS_BUCKET_NAME/staging \
  --parameters \
instanceId=$SPANNER_INSTANCE,\
databaseId=$SPANNER_DB,\
importManifest=gs://$GCS_BUCKET_NAME/regional_sales_manifest.json,escape='\'

אפשר לבדוק את הסטטוס של משימת Dataflow באמצעות הפקודה הבאה

gcloud dataflow jobs list \
    --filter="name:spanner-import-from-gcs" \
    --region="$GCP_REGION" \
    --sort-by="~creationTime" \
    --limit=1

הפעולה אמורה להימשך כ-5 דקות.

אימות הנתונים ב-Spanner

אחרי שהעבודה של Dataflow מסתיימת בהצלחה, מוודאים שהנתונים נטענו ל-Spanner.

קודם כול, בודקים את מספר השורות. הוא צריך להיות 4, 375.

gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT COUNT(*) FROM regional_sales;'

אחר כך מריצים שאילתה על כמה שורות כדי לבדוק את הנתונים.

gcloud spanner databases execute-sql $SPANNER_DB \
--instance=$SPANNER_INSTANCE \
--sql='SELECT * FROM regional_sales LIMIT 5'

הנתונים שיובאו מטבלת Databricks אמורים להיות גלויים.

6. ניקוי תלונות

ניקוי Spanner

מחיקה של מסד הנתונים והמכונה של Spanner

gcloud spanner instances delete $SPANNER_INSTANCE

ניקוי GCS

מחיקת דלי GCS שנוצר לאירוח הנתונים

gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

ניקוי Databricks

מחיקת קטלוג, סכימה או טבלה

  1. כניסה למופע Databricks
  2. לוחצים על 20bae9c2c9097306.png בתפריט שבצד ימין.
  3. בוחרים את retl_tpch_project שיצרתם קודם מרשימת הקטלוג.

fc566eb3fddd7477.png

  1. ברשימת הסכימות, בוחרים את tpch_data שנוצר
  2. בוחרים את regional_sales_csv שנוצר קודם מרשימת הטבלאות.
  3. מרחיבים את אפשרויות הטבלה על ידי לחיצה על df6dbe6356f141c6.png ובוחרים באפשרות מחיקה.
  4. לוחצים על מחיקה בתיבת הדו-שיח לאישור כדי למחוק את הטבלה.
  5. אחרי שהטבלה תימחק, תחזרו לדף הסכימה.
  6. מרחיבים את אפשרויות הסכימה על ידי לחיצה על df6dbe6356f141c6.png ובוחרים באפשרות מחיקה.
  7. לוחצים על מחיקה בתיבת הדו-שיח לאישור כדי למחוק את הסכימה.
  8. אחרי שהסכימה תימחק, תחזרו לדף הקטלוג.
  9. אם קיימת סכימה של default, חוזרים על שלבים 4 עד 11 כדי למחוק אותה.
  10. בדף הקטלוג, לוחצים על סמל האפשרויות הנוספות (3 נקודות) df6dbe6356f141c6.png כדי להרחיב את אפשרויות הקטלוג, ואז בוחרים באפשרות מחיקה.
  11. בתיבת הדו-שיח לאישור, לוחצים על מחיקה כדי למחוק את הקטלוג.

מחיקת מיקום נתונים חיצוניים / פרטי כניסה

  1. במסך הקטלוג, לוחצים על הסמל 32d5a94ae444cd8e.png.
  2. אם לא מופיעה האפשרות External Data, יכול להיות שהאפשרות External Location מופיעה בתפריט הנפתח Connect.
  3. לוחצים על retl-gcs-location המיקום של הנתונים החיצוניים שיצרתם קודם.
  4. בדף המיקום החיצוני, לוחצים על df6dbe6356f141c6.png כדי להרחיב את אפשרויות המיקום ובוחרים באפשרות Delete.
  5. בתיבת הדו-שיח לאישור, לוחצים על מחיקה כדי למחוק את המיקום החיצוני.
  6. לוחצים על e03562324c0ba85e.png
  7. לוחצים על retl-gcs-credential שנוצר קודם.
  8. בדף פרטי הכניסה, לוחצים על df6dbe6356f141c6.png כדי להרחיב את האפשרויות של פרטי הכניסה ובוחרים באפשרות Delete.
  9. לוחצים על מחיקה בתיבת הדו-שיח לאישור כדי למחוק את פרטי הכניסה.

7. מזל טוב

כל הכבוד, סיימתם את ה-Codelab.

מה נכלל

  • איך טוענים נתונים ל-Databricks
  • איך יוצרים קטגוריה ב-GCS
  • איך מייצאים טבלה של Databricks ל-GCS בפורמט CSV
  • איך מגדירים מופע Spanner
  • איך טוענים טבלאות CSV ל-Spanner באמצעות Dataflow