نقل البيانات من Databricks إلى Spanner باستخدام ملف CSV

1. إنشاء مسار عكسي لاستخراج البيانات وتحويلها (ETL) من Databricks إلى Spanner باستخدام "خدمة التخزين السحابي من Google" وDataflow

مقدمة

في هذا الدرس العملي، ستنشئ مسار Reverse ETL من Databricks إلى Spanner باستخدام ملفات CSV المخزَّنة في Google Cloud Storage. في السابق، كانت عمليات نقل البيانات (استخراج البيانات وتحويلها وتحميلها) تنقل البيانات من قواعد البيانات التشغيلية إلى مستودع بيانات، مثل Databricks، لإجراء الإحصاءات. يعمل مسار Reverse ETL بشكل معاكس: ينقل البيانات المنسّقة والمعالَجة من مستودع البيانات إلى الأنظمة التشغيلية حيث يمكنه تشغيل التطبيقات أو تقديم ميزات للمستخدمين أو استخدامه في اتخاذ القرارات في الوقت الفعلي.

الهدف هو نقل مجموعة بيانات نموذجية من جدول Databricks إلى Spanner، وهي قاعدة بيانات ارتباطية موزّعة عالميًا ومثالية للتطبيقات العالية التوفّر.

لتحقيق ذلك، يتم استخدام Google Cloud Storage (GCS) وDataflow كخطوات وسيطة. في ما يلي تفصيل لتدفّق البيانات وسبب اختيار هذه البنية:

  1. نقل البيانات من Databricks إلى Google Cloud Storage (GCS) بتنسيق CSV:
  • تتمثّل الخطوة الأولى في استخراج البيانات من Databricks بتنسيق مفتوح وعالمي. يُعدّ التصدير إلى ملف CSV طريقة شائعة ومباشرة لإنشاء ملفات بيانات قابلة للنقل. سيتم تنظيم هذه الملفات في GCS، ما يوفّر حلاً قابلاً للتوسّع ومتينًا لتخزين الكائنات.
  1. من "خدمة التخزين السحابي من Google" إلى Spanner (عبر Dataflow):
  • بدلاً من كتابة نص برمجي مخصّص للقراءة من GCS والكتابة إلى Spanner، يتم استخدام Google Dataflow، وهي خدمة معالجة بيانات مُدارة بالكامل. توفّر خدمة Dataflow نماذج مُعدّة مسبقًا خصيصًا لهذا النوع من المهام. يتيح استخدام نموذج "نقل النص من GCS إلى Cloud Spanner" إمكانية استيراد البيانات المتوازية ذات معدل النقل العالي بدون كتابة أي رمز لمعالجة البيانات، ما يوفّر وقتًا كبيرًا في عملية التطوير.

أهداف الدورة التعليمية

  • كيفية تحميل البيانات إلى Databricks
  • كيفية إنشاء حزمة GCS
  • كيفية تصدير جدول Databricks إلى GCS بتنسيق CSV
  • كيفية إعداد مثيل Spanner
  • كيفية تحميل جداول CSV إلى Spanner باستخدام Dataflow

2. الإعداد والمتطلبات والقيود

المتطلبات الأساسية

  • حساب Databricks لديه أذونات لإنشاء مجموعات وتثبيت مكتبات لا يكفي حساب تجريبي مجاني لهذا الدرس التطبيقي.
  • حساب على Google Cloud تم تفعيل واجهات برمجة التطبيقات Spanner وCloud Storage وDataflow فيه
  • الوصول إلى Google Cloud Console من خلال متصفّح ويب
  • وحدة طرفية مثبَّت عليها واجهة سطر الأوامر (CLI) في Google Cloud
  • إذا كانت مؤسستك على Google Cloud مفعَّلة فيها سياسة iam.allowedPolicyMemberDomains، قد يحتاج المشرف إلى منح استثناء للسماح بحسابات الخدمة من نطاقات خارجية. سيتم تناول هذا الموضوع في خطوة لاحقة عند الاقتضاء.

أذونات "إدارة الهوية وإمكانية الوصول" في Google Cloud Platform

يجب أن يتضمّن حساب 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. يرشدك هذا المختبر إلى مجموعة شائعة من عمليات ربط الأنواع.

إعداد خصائص قابلة لإعادة الاستخدام

ستحتاج إلى بعض القيم بشكل متكرّر خلال هذا الدرس التطبيقي. لتسهيل ذلك، سنضبط هذه القيم على متغيرات shell لاستخدامها لاحقًا.

  • GCP_REGION: المنطقة المحدّدة التي سيتم فيها تحديد موقع موارد GCP. يمكنك الاطّلاع على قائمة المناطق هنا.
  • GCP_PROJECT: رقم تعريف مشروع Google Cloud Platform المطلوب استخدامه.
  • 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

في هذا المختبر، يتم استضافة حساب Databricks على Google Cloud Platform للسماح بتحديد موقع بيانات خارجي في Google Cloud Storage.

Google Cloud

يتطلّب هذا المختبر مشروعًا على Google Cloud.

مشروع Google Cloud

المشروع هو وحدة تنظيم أساسية في Google Cloud. إذا قدّم المشرف رمزًا لاستخدامه، يمكن تخطّي هذه الخطوة.

يمكن إنشاء مشروع باستخدام واجهة سطر الأوامر على النحو التالي:

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. انقر على البيانات الخارجية إذا كانت متاحة في أعلى صفحة الفهرس. بخلاف ذلك، انقر على القائمة المنسدلة ربط، ثم انقر على بيانات الاعتماد.
  3. انتقِل إلى علامة التبويب بيانات الاعتماد إذا لم تكن عليها.
  4. انقر على إنشاء بيانات اعتماد.
  5. اختَر GCP Service Account في نوع بيانات الاعتماد
  6. أدخِل codelabs-retl-credentials في حقل اسم بيانات الاعتماد.
  7. انقر على إنشاء
  8. انسخ البريد الإلكتروني لحساب الخدمة من مربّع الحوار وانقر على تم.

اضبط حساب الخدمة هذا على متغيّر بيئة في مثيل shell لإعادة استخدامه:

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. ارجع إلى صفحة بيانات الاعتماد باستخدام مسار التنقل في أعلى الصفحة.
  2. الانتقال إلى علامة التبويب الموقع الجغرافي الخارجي
  3. انقر على إنشاء موقع جغرافي خارجي.
  4. ضبط اسم الموقع الجغرافي الخارجي على codelabs-retl-gcs
  5. اترك نوع وحدة التخزين على GCP
  6. اضبط مسار الحزمة على عنوان URL
  7. اضبط بيانات اعتماد التخزين على codelabs-retl-credentials
  8. انقر على إنشاء
  9. في رسالة التأكيد انقر على إنشاء

إنشاء كتالوج ومخطط

  1. في قائمة الجانب الأيمن، انقر على الفهرس.
  2. انقر على إنشاء، ثم على إنشاء كتالوج
  3. اضبط اسم قائمة المنتجات على retl_tpch_project
  4. اضبط النوع على Standard
  5. اختَر codelabs-retl-gcs كموقع جغرافي خارجي
  6. انقر على إنشاء
  7. انقر على retl_tpch_project من قائمة الفهرس
  8. انقر على إنشاء مخطط.
  9. اضبط اسم المخطط على tpch_data
  10. اختَر موقع التخزين ليكون codelabs-retl-gcs
  11. انقر على إنشاء

تصدير البيانات بتنسيق CSV

أصبحت البيانات الآن جاهزة للتصدير. سيتم استخدام مجموعة بيانات TPC-H النموذجية لتحديد الجدول الجديد الذي سيتم تخزينه خارجيًا بتنسيق CSV.

أولاً، انسخ البيانات النموذجية إلى جدول جديد في مساحة العمل. لإجراء ذلك، يجب تشغيل رمز SQL من طلب بحث.

  1. في القائمة على يمين الصفحة ضمن SQL، انقر على طلبات البحث.
  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.

تحقَّق أولاً من عدد الصفوف، يجب أن يكون 4375

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. اتّبِع الخطوات من 4 إلى 11 مرة أخرى لحذف مخطط default إذا كان متوفّرًا.
  10. من صفحة "قائمة الكتب"، وسِّع خيارات القائمة بالنقر على 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. تهانينا

تهانينا على إكمال تجربة البرمجة.

المواضيع التي تناولناها

  • كيفية تحميل البيانات إلى Databricks
  • كيفية إنشاء حزمة GCS
  • كيفية تصدير جدول Databricks إلى GCS بتنسيق CSV
  • كيفية إعداد مثيل Spanner
  • كيفية تحميل جداول CSV إلى Spanner باستخدام Dataflow