معکوس کردن ETL از Databricks به Spanner با استفاده از CSV

۱. ساخت یک خط لوله ETL معکوس از Databricks به Spanner با استفاده از GCS و Dataflow

مقدمه

در این آزمایشگاه کد، شما با استفاده از فایل‌های CSV ذخیره شده در فضای ابری گوگل، یک خط لوله ETL معکوس از Databricks به Spanner خواهید ساخت. به طور سنتی، خطوط لوله ETL (استخراج، تبدیل، بارگذاری) داده‌ها را از پایگاه‌های داده عملیاتی به یک انبار داده مانند Databricks برای تجزیه و تحلیل منتقل می‌کنند. یک خط لوله ETL معکوس برعکس عمل می‌کند: داده‌های جمع‌آوری‌شده و پردازش‌شده را از انبار داده به سیستم‌های عملیاتی برمی‌گرداند، جایی که می‌توانند برنامه‌های کاربردی را پشتیبانی کنند، ویژگی‌های کاربرپسند را ارائه دهند یا برای تصمیم‌گیری در زمان واقعی استفاده شوند.

هدف، انتقال یک مجموعه داده نمونه از جدول Databricks به Spanner است، که یک پایگاه داده رابطه‌ای توزیع‌شده جهانی و ایده‌آل برای برنامه‌های با دسترسی‌پذیری بالا است.

برای دستیابی به این هدف، از فضای ذخیره‌سازی ابری گوگل (GCS) و جریان داده (Dataflow) به عنوان مراحل میانی استفاده می‌شود. در اینجا به تفصیل جریان داده و دلیل این معماری آمده است:

  1. تبدیل دیتابریک‌ها به فضای ذخیره‌سازی ابری گوگل (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

۲. راه‌اندازی، الزامات و محدودیت‌ها

پیش‌نیازها

  • یک حساب کاربری Databricks با مجوزهای ایجاد کلاسترها و نصب کتابخانه‌ها. یک حساب کاربری آزمایشی رایگان برای این آزمایش کافی نیست.
  • یک حساب Google Cloud که API های Spanner، Cloud Storage و Dataflow در آن فعال باشد.
  • دسترسی به کنسول گوگل کلود از طریق مرورگر وب.
  • یک ترمینال که رابط خط فرمان گوگل کلود (Google Cloud CLI) روی آن نصب شده باشد.
  • اگر سیاست iam.allowedPolicyMemberDomains در سازمان Google Cloud شما فعال باشد، ممکن است لازم باشد مدیر سیستم برای مجاز کردن حساب‌های سرویس از دامنه‌های خارجی، استثنا قائل شود. این موضوع در مرحله بعدی، در صورت لزوم، پوشش داده خواهد شد.

مجوزهای IAM پلتفرم ابری گوگل

برای اجرای تمام مراحل این codelab، حساب گوگل به مجوزهای زیر نیاز دارد.

حساب‌های خدماتی

iam.serviceAccountKeys.create

امکان ایجاد حساب‌های کاربری سرویس (Service Accounts) را فراهم می‌کند.

آچار

spanner.instances.create

امکان ایجاد یک نمونه جدید از Spanner را فراهم می‌کند.

spanner.databases.create

به اجرای دستورات DDL اجازه ایجاد می‌دهد.

spanner.databases.updateDdl

به اجرای دستورات DDL اجازه می‌دهد تا جداولی در پایگاه داده ایجاد کنند.

فضای ذخیره‌سازی ابری گوگل

storage.buckets.create

امکان ایجاد یک سطل GCS جدید برای ذخیره فایل‌های پارکت صادر شده را فراهم می‌کند.

storage.objects.create

امکان نوشتن فایل‌های پارکت صادر شده را در سطل GCS فراهم می‌کند.

storage.objects.get

به BigQuery اجازه می‌دهد فایل‌های Parquet را از سطل GCS بخواند.

storage.objects.list

به BigQuery اجازه می‌دهد تا فایل‌های Parquet را در سطل GCS فهرست کند.

جریان داده

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 سازگار هستند. این آزمایش مجموعه‌ای مشترک از نگاشت‌های نوع را بررسی می‌کند.

تنظیم ویژگی‌های قابل استفاده مجدد

چند مقدار وجود دارد که در طول این تمرین بارها مورد نیاز خواهند بود. برای آسان‌تر کردن این کار، این مقادیر را به متغیرهای پوسته تنظیم می‌کنیم تا بعداً مورد استفاده قرار گیرند.

  • 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 که روی GCP میزبانی می‌شود تا امکان تعریف یک مکان داده خارجی در GCS را فراهم کند.

گوگل کلود

این آزمایشگاه به یک پروژه Google Cloud نیاز دارد.

پروژه ابری گوگل

یک پروژه واحد اساسی سازماندهی در Google Cloud است. اگر مدیر پروژه‌ای را برای استفاده ارائه کرده باشد، می‌توان از این مرحله صرف نظر کرد.

یک پروژه می‌تواند با استفاده از CLI به صورت زیر ایجاد شود:

gcloud projects create $GCP_PROJECT
gcloud config set project $GCP_PROJECT

درباره ایجاد و مدیریت پروژه‌ها اینجا بیشتر بیاموزید.

تنظیم آچار

برای شروع استفاده از 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

۳. یک سطل ذخیره‌سازی ابری گوگل ایجاد کنید

از فضای ذخیره‌سازی ابری گوگل (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

فایل تست را پاک کنید

اکنون فضای ذخیره‌سازی ابری راه‌اندازی شده است. اکنون می‌توانید فایل آزمایشی موقت را حذف کنید.

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

خروجی باید حذف را تأیید کند:

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

۴. خروجی گرفتن از Databricks به GCS

اکنون، محیط Databricks برای اتصال ایمن به GCS و صادرات داده‌ها پیکربندی خواهد شد.

ایجاد اعتبارنامه‌ها

  1. در منوی سمت چپ، روی کاتالوگ کلیک کنید
  2. اگر در بالای صفحه کاتالوگ موجود است، روی «داده‌های خارجی» کلیک کنید. در غیر این صورت، روی منوی کشویی «اتصال» کلیک کنید و سپس روی «اعتبارنامه‌ها» کلیک کنید.
  3. اگر هنوز به برگه اعتبارنامه‌ها (Credentials) نرفته‌اید، به آن بروید.
  4. روی ایجاد اعتبارنامه کلیک کنید
  5. برای نوع اعتبارنامه، GCP Service Account انتخاب کنید.
  6. برای Credential Name عبارت 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. با استفاده از نشانه‌های بالای صفحه، به صفحه اعتبارنامه‌ها برگردید.
  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. نام Schema را روی tpch_data تنظیم کنید
  10. محل ذخیره‌سازی را codelabs-retl-gcs انتخاب کنید.
  11. روی ایجاد کلیک کنید

خروجی گرفتن از داده‌ها به صورت CSV

اکنون داده‌ها برای خروجی گرفتن آماده هستند. از مجموعه داده نمونه TPC-H برای تعریف جدول جدید ما که به صورت خارجی به صورت CSV ذخیره خواهد شد، استفاده خواهد شد.

ابتدا، داده‌های نمونه را در یک جدول جدید در فضای کاری کپی کنید. برای انجام این کار، کد SQL باید از یک پرس‌وجو اجرا شود.

  1. در منوی سمت چپ، زیر SQL ، روی Queries کلیک کنید.
  2. روی دکمه ایجاد پرس و جو کلیک کنید
  3. در کنار دکمه‌ی Run ، فضای کاری (Workspace) را روی 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

برای مشاهده فایل‌های ایجاد شده توسط Databricks، سطل GCS را بررسی کنید.

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

یک یا چند فایل .csv باید به همراه فایل‌های _SUCCESS و لاگ قابل مشاهده باشند.

۵. بارگذاری داده‌ها در Spanner با Dataflow

یک الگوی Dataflow ارائه شده توسط گوگل برای وارد کردن داده‌های CSV از GCS به 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 به یک فایل "manifest" نیاز دارد. این یک فایل 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

فعال کردن 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

کار باید حدود ۵ دقیقه طول بکشد تا تمام شود.

تأیید داده‌ها در Spanner

پس از موفقیت‌آمیز بودن عملیات Dataflow، تأیید کنید که داده‌ها در Spanner بارگذاری شده‌اند.

ابتدا، تعداد ردیف‌ها را بررسی کنید، باید ۴۳۷۵ باشد.

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 باید قابل مشاهده باشند.

۶. تمیز کردن

آچار تمیز کننده

پایگاه داده Spanner و نمونه آن را حذف کنید

gcloud spanner instances delete $SPANNER_INSTANCE

GCS را تمیز کنید

سطل GCS ایجاد شده برای میزبانی داده‌ها را حذف کنید

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

پاکسازی دیتابریک‌ها

حذف کاتالوگ/طرحواره/جدول

  1. وارد نمونه Databricks خود شوید
  2. کلیک کنید 20bae9c2c9097306.png از منوی سمت چپ
  3. retl_tpch_project که قبلاً ایجاد شده است را از لیست کاتالوگ انتخاب کنید.

fc566eb3fddd7477.png

  1. در لیست Schema، tpch_data ایجاد شده را انتخاب کنید.
  2. فایل regional_sales_csv که قبلاً ایجاد شده است را از لیست جدول انتخاب کنید.
  3. با کلیک کردن روی، گزینه‌های جدول را گسترش دهید df6dbe6356f141c6.png و حذف را انتخاب کنید
  4. برای حذف جدول، در کادر تأیید روی حذف کلیک کنید.
  5. پس از حذف جدول، به صفحه طرحواره بازگردانده خواهید شد.
  6. با کلیک کردن روی، گزینه‌های طرحواره را گسترش دهید df6dbe6356f141c6.png و حذف را انتخاب کنید
  7. برای حذف طرحواره، در کادر تأیید روی حذف کلیک کنید.
  8. پس از حذف طرحواره، به صفحه کاتالوگ بازگردانده خواهید شد.
  9. مراحل ۴ تا ۱۱ را دوباره دنبال کنید تا طرحواره default در صورت وجود) حذف شود.
  10. از صفحه کاتالوگ، با کلیک روی گزینه‌های کاتالوگ، آنها را گسترش دهید df6dbe6356f141c6.png و حذف را انتخاب کنید
  11. برای حذف کاتالوگ، در کادر تأیید روی حذف کلیک کنید.

حذف مکان/اعتبارنامه‌های داده‌های خارجی

  1. از صفحه کاتالوگ، روی کلیک کنید 32d5a94ae444cd8e.png
  2. اگر گزینه‌ی External Data را نمی‌بینید، ممکن است در منوی کشویی Connect گزینه‌ی External Location را مشاهده کنید.
  3. روی مکان داده خارجی retl-gcs-location که قبلاً ایجاد شده است کلیک کنید
  4. از صفحه موقعیت مکانی خارجی، با کلیک روی گزینه‌ها، گزینه‌های موقعیت مکانی را گسترش دهید. df6dbe6356f141c6.png و Delete را انتخاب کنید
  5. برای حذف مکان خارجی، در کادر تأیید روی حذف کلیک کنید.
  6. کلیک کنید e03562324c0ba85e.png
  7. روی retl-gcs-credential که قبلاً ایجاد شده بود کلیک کنید
  8. از صفحه اعتبارنامه، با کلیک روی موارد زیر، گزینه‌های اعتبارنامه را گسترش دهید. df6dbe6356f141c6.png و Delete را انتخاب کنید
  9. برای حذف اعتبارنامه‌ها، در کادر تأیید، روی حذف کلیک کنید.

۷. تبریک

تبریک می‌گویم که آزمایشگاه کد را تمام کردی.

آنچه ما پوشش داده‌ایم

  • نحوه بارگذاری داده‌ها در Databricks
  • نحوه ایجاد یک سطل GCS
  • نحوه خروجی گرفتن از جدول Databricks به GCS با فرمت CSV
  • نحوه راه‌اندازی یک نمونه Spanner
  • نحوه بارگذاری جداول CSV در Spanner با Dataflow