۱. ساخت یک خط لوله ETL معکوس از Databricks به Spanner با استفاده از GCS و Dataflow
مقدمه
در این آزمایشگاه کد، شما با استفاده از فایلهای CSV ذخیره شده در فضای ابری گوگل، یک خط لوله ETL معکوس از Databricks به Spanner خواهید ساخت. به طور سنتی، خطوط لوله ETL (استخراج، تبدیل، بارگذاری) دادهها را از پایگاههای داده عملیاتی به یک انبار داده مانند Databricks برای تجزیه و تحلیل منتقل میکنند. یک خط لوله ETL معکوس برعکس عمل میکند: دادههای جمعآوریشده و پردازششده را از انبار داده به سیستمهای عملیاتی برمیگرداند، جایی که میتوانند برنامههای کاربردی را پشتیبانی کنند، ویژگیهای کاربرپسند را ارائه دهند یا برای تصمیمگیری در زمان واقعی استفاده شوند.
هدف، انتقال یک مجموعه داده نمونه از جدول Databricks به Spanner است، که یک پایگاه داده رابطهای توزیعشده جهانی و ایدهآل برای برنامههای با دسترسیپذیری بالا است.
برای دستیابی به این هدف، از فضای ذخیرهسازی ابری گوگل (GCS) و جریان داده (Dataflow) به عنوان مراحل میانی استفاده میشود. در اینجا به تفصیل جریان داده و دلیل این معماری آمده است:
- تبدیل دیتابریکها به فضای ذخیرهسازی ابری گوگل (GCS) با فرمت CSV:
- اولین قدم، استخراج دادهها از Databricks در قالبی باز و جهانی است. خروجی گرفتن به CSV روشی رایج و سرراست برای ایجاد فایلهای داده قابل حمل است. این فایلها در GCS قرار میگیرند که یک راهکار ذخیرهسازی شیء مقیاسپذیر و بادوام ارائه میدهد.
- 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، حساب گوگل به مجوزهای زیر نیاز دارد.
حسابهای خدماتی | ||
| امکان ایجاد حسابهای کاربری سرویس (Service Accounts) را فراهم میکند. | |
آچار | ||
| امکان ایجاد یک نمونه جدید از Spanner را فراهم میکند. | |
| به اجرای دستورات DDL اجازه ایجاد میدهد. | |
| به اجرای دستورات DDL اجازه میدهد تا جداولی در پایگاه داده ایجاد کنند. | |
فضای ذخیرهسازی ابری گوگل | ||
| امکان ایجاد یک سطل GCS جدید برای ذخیره فایلهای پارکت صادر شده را فراهم میکند. | |
| امکان نوشتن فایلهای پارکت صادر شده را در سطل GCS فراهم میکند. | |
| به BigQuery اجازه میدهد فایلهای Parquet را از سطل GCS بخواند. | |
| به BigQuery اجازه میدهد تا فایلهای Parquet را در سطل GCS فهرست کند. | |
جریان داده | ||
| امکان دریافت اقلام کاری از Dataflow را فراهم میکند. | |
| به کارگر Dataflow اجازه میدهد تا پیامها را به سرویس Dataflow ارسال کند. | |
| به کاربران Dataflow اجازه میدهد تا ورودیهای لاگ را در Google Cloud Logging بنویسند. | |
برای راحتی، میتوان از نقشهای از پیش تعریفشدهای که حاوی این مجوزها هستند استفاده کرد.
|
|
|
|
|
|
|
|
محدودیتها
هنگام انتقال دادهها بین سیستمها، آگاهی از تفاوتهای نوع داده مهم است.
- تبدیل 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 و صادرات دادهها پیکربندی خواهد شد.
ایجاد اعتبارنامهها
- در منوی سمت چپ، روی کاتالوگ کلیک کنید
- اگر در بالای صفحه کاتالوگ موجود است، روی «دادههای خارجی» کلیک کنید. در غیر این صورت، روی منوی کشویی «اتصال» کلیک کنید و سپس روی «اعتبارنامهها» کلیک کنید.
- اگر هنوز به برگه اعتبارنامهها (Credentials) نرفتهاید، به آن بروید.
- روی ایجاد اعتبارنامه کلیک کنید
- برای نوع اعتبارنامه،
GCP Service Accountانتخاب کنید. - برای Credential Name عبارت
codelabs-retl-credentialsرا وارد کنید. - روی ایجاد کلیک کنید
- ایمیل حساب سرویس را از کادر محاورهای کپی کنید و روی «انجام شد» کلیک کنید
این حساب سرویس را برای استفاده مجدد، روی یک متغیر محیطی در نمونه پوسته خود تنظیم کنید:
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"
ایجاد موقعیت مکانی خارجی
- با استفاده از نشانههای بالای صفحه، به صفحه اعتبارنامهها برگردید.
- به برگه موقعیت مکانی خارجی بروید
- روی ایجاد مکان خارجی کلیک کنید
- نام مکان خارجی را روی
codelabs-retl-gcsتنظیم کنید - نوع ذخیرهسازی را به عنوان
GCPنگه دارید - مسیر سطل خود را روی URL تنظیم کنید
- اعتبارنامهی ذخیرهسازی را روی
codelabs-retl-credentialsتنظیم کنید. - روی ایجاد کلیک کنید
- در تأیید، روی ایجاد کلیک کنید
ایجاد کاتالوگ و طرحواره
- در منوی سمت چپ، روی کاتالوگ کلیک کنید
- روی ایجاد کلیک کنید، سپس یک کاتالوگ ایجاد کنید
- نام کاتالوگ را
retl_tpch_projectقرار دهید - نوع را روی
Standardتنظیم کنید -
codelabs-retl-gcsبه عنوان مکان خارجی انتخاب کنید - روی ایجاد کلیک کنید
- از لیست کاتالوگ روی
retl_tpch_projectکلیک کنید. - روی ایجاد طرحواره کلیک کنید
- نام Schema را روی
tpch_dataتنظیم کنید - محل ذخیرهسازی را
codelabs-retl-gcsانتخاب کنید. - روی ایجاد کلیک کنید
خروجی گرفتن از دادهها به صورت CSV
اکنون دادهها برای خروجی گرفتن آماده هستند. از مجموعه داده نمونه TPC-H برای تعریف جدول جدید ما که به صورت خارجی به صورت CSV ذخیره خواهد شد، استفاده خواهد شد.
ابتدا، دادههای نمونه را در یک جدول جدید در فضای کاری کپی کنید. برای انجام این کار، کد SQL باید از یک پرسوجو اجرا شود.
- در منوی سمت چپ، زیر SQL ، روی Queries کلیک کنید.
- روی دکمه ایجاد پرس و جو کلیک کنید
- در کنار دکمهی 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
پاکسازی دیتابریکها
حذف کاتالوگ/طرحواره/جدول
- وارد نمونه Databricks خود شوید
- کلیک کنید
از منوی سمت چپ -
retl_tpch_projectکه قبلاً ایجاد شده است را از لیست کاتالوگ انتخاب کنید.

- در لیست Schema،
tpch_dataایجاد شده را انتخاب کنید. - فایل
regional_sales_csvکه قبلاً ایجاد شده است را از لیست جدول انتخاب کنید. - با کلیک کردن روی، گزینههای جدول را گسترش دهید
و حذف را انتخاب کنید - برای حذف جدول، در کادر تأیید روی حذف کلیک کنید.
- پس از حذف جدول، به صفحه طرحواره بازگردانده خواهید شد.
- با کلیک کردن روی، گزینههای طرحواره را گسترش دهید
و حذف را انتخاب کنید - برای حذف طرحواره، در کادر تأیید روی حذف کلیک کنید.
- پس از حذف طرحواره، به صفحه کاتالوگ بازگردانده خواهید شد.
- مراحل ۴ تا ۱۱ را دوباره دنبال کنید تا طرحواره
defaultدر صورت وجود) حذف شود. - از صفحه کاتالوگ، با کلیک روی گزینههای کاتالوگ، آنها را گسترش دهید
و حذف را انتخاب کنید - برای حذف کاتالوگ، در کادر تأیید روی حذف کلیک کنید.
حذف مکان/اعتبارنامههای دادههای خارجی
- از صفحه کاتالوگ، روی کلیک کنید

- اگر گزینهی
External Dataرا نمیبینید، ممکن است در منوی کشوییConnectگزینهیExternal Locationرا مشاهده کنید. - روی مکان داده خارجی
retl-gcs-locationکه قبلاً ایجاد شده است کلیک کنید - از صفحه موقعیت مکانی خارجی، با کلیک روی گزینهها، گزینههای موقعیت مکانی را گسترش دهید.
و Deleteرا انتخاب کنید - برای حذف مکان خارجی، در کادر تأیید روی حذف کلیک کنید.
- کلیک کنید

- روی
retl-gcs-credentialکه قبلاً ایجاد شده بود کلیک کنید - از صفحه اعتبارنامه، با کلیک روی موارد زیر، گزینههای اعتبارنامه را گسترش دهید.
و Deleteرا انتخاب کنید - برای حذف اعتبارنامهها، در کادر تأیید، روی حذف کلیک کنید.
۷. تبریک
تبریک میگویم که آزمایشگاه کد را تمام کردی.
آنچه ما پوشش دادهایم
- نحوه بارگذاری دادهها در Databricks
- نحوه ایجاد یک سطل GCS
- نحوه خروجی گرفتن از جدول Databricks به GCS با فرمت CSV
- نحوه راهاندازی یک نمونه Spanner
- نحوه بارگذاری جداول CSV در Spanner با Dataflow