Trích xuất, chuyển đổi và tải dữ liệu (ETL) ngược từ Databricks sang Spanner bằng BigQuery

1. Xây dựng quy trình ETL đảo ngược từ Databricks sang Spanner bằng Google Cloud Storage và BigQuery

Giới thiệu

Trong lớp học lập trình này, bạn sẽ tạo một quy trình Reverse ETL từ Databricks đến Spanner. Theo truyền thống, các quy trình ETL (Trích xuất, Biến đổi, Tải) tiêu chuẩn sẽ di chuyển dữ liệu từ cơ sở dữ liệu hoạt động vào một kho dữ liệu như Databricks để phân tích. Quy trình ETL đảo ngược thực hiện ngược lại bằng cách di chuyển dữ liệu đã được xử lý và tuyển chọn từ kho dữ liệu trở lại cơ sở dữ liệu hoạt động, chẳng hạn như Spanner, một cơ sở dữ liệu quan hệ được phân phối trên toàn cầu, lý tưởng cho các ứng dụng có tính sẵn sàng cao, nơi dữ liệu có thể hỗ trợ các ứng dụng, cung cấp các tính năng cho người dùng hoặc được dùng để đưa ra quyết định theo thời gian thực.

Mục tiêu là di chuyển một tập dữ liệu tổng hợp từ các bảng Databricks Iceberg vào các bảng Spanner.

Để đạt được điều này, Google Cloud Storage (GCS) và BigQuery được dùng làm các bước trung gian. Sau đây là thông tin chi tiết về dòng dữ liệu và lý do đằng sau cấu trúc này:

b2dae0f06b59656a.png

  1. Databricks sang Google Cloud Storage (GCS) ở định dạng Iceberg:
  • Bước đầu tiên là lấy dữ liệu từ Databricks ở định dạng mở, được xác định rõ ràng. Bảng được xuất ở định dạng Apache Iceberg. Quy trình này ghi dữ liệu cơ bản dưới dạng một nhóm tệp Parquet và siêu dữ liệu của bảng (giản đồ, phân vùng, vị trí tệp) dưới dạng tệp JSON và Avro. Việc dàn dựng cấu trúc bảng hoàn chỉnh này trong GCS giúp dữ liệu có thể di chuyển và truy cập được vào mọi hệ thống hiểu định dạng Iceberg.
  1. Chuyển đổi bảng Iceberg GCS thành bảng bên ngoài BigLake của BigQuery:
  • Thay vì tải dữ liệu trực tiếp từ GCS vào Spanner, BigQuery được dùng làm một trung gian mạnh mẽ. Một bảng bên ngoài BigLake được tạo trong BigQuery và trỏ trực tiếp đến tệp siêu dữ liệu Iceberg trong GCS. Phương pháp này có một số ưu điểm:
  • Không trùng lặp dữ liệu: BigQuery đọc cấu trúc bảng từ siêu dữ liệu và truy vấn các tệp dữ liệu Parquet tại chỗ mà không cần nhập các tệp này, giúp tiết kiệm đáng kể thời gian và chi phí lưu trữ.
  • Truy vấn liên kết: Cho phép chạy các truy vấn SQL phức tạp trên dữ liệu GCS như thể đó là một bảng BigQuery gốc.
  1. ReverseETL bảng bên ngoài BigLake vào Spanner:
  • Bước cuối cùng là di chuyển dữ liệu từ BigQuery vào Spanner. Điều này được thực hiện bằng cách sử dụng một tính năng mạnh mẽ trong BigQuery có tên là truy vấn EXPORT DATA, đây là bước "ETL đảo ngược".
  • Khả năng sẵn sàng hoạt động: Spanner được thiết kế cho các khối lượng công việc giao dịch, mang lại tính nhất quán cao và khả năng hoạt động cao cho các ứng dụng. Bằng cách di chuyển dữ liệu vào Spanner, dữ liệu sẽ có thể truy cập được đối với các ứng dụng, API và hệ thống vận hành khác mà người dùng sử dụng, yêu cầu tra cứu điểm có độ trễ thấp.
  • Khả năng mở rộng: Mẫu này cho phép khai thác sức mạnh phân tích của BigQuery để xử lý các tập dữ liệu lớn, sau đó phân phát kết quả một cách hiệu quả thông qua cơ sở hạ tầng có khả năng mở rộng trên toàn cầu của Spanner.

Dịch vụ và thuật ngữ

  • DataBricks – Nền tảng dữ liệu dựa trên đám mây được xây dựng dựa trên Apache Spark.
  • Spanner – Một cơ sở dữ liệu quan hệ được phân phối trên toàn cầu và do Google quản lý toàn bộ.
  • Google Cloud Storage – Sản phẩm bộ nhớ blob của Google Cloud.
  • BigQuery – Kho dữ liệu không máy chủ để phân tích, do Google quản lý hoàn toàn.
  • Iceberg – Một định dạng bảng mở do Apache xác định, cung cấp khả năng trừu tượng hoá đối với các định dạng tệp dữ liệu nguồn mở phổ biến.
  • Parquet – Một định dạng tệp dữ liệu nhị phân dạng cột mã nguồn mở của Apache.

Kiến thức bạn sẽ học được

  • Cách tải dữ liệu vào Databricks dưới dạng bảng Iceberg
  • Cách tạo một Nhóm lưu trữ GCS
  • Cách xuất bảng Databricks sang GCS ở định dạng Iceberg
  • Cách tạo Bảng bên ngoài BigLake trong BigQuery từ bảng Iceberg trong GCS
  • Cách thiết lập một phiên bản Spanner
  • Cách tải Bảng bên ngoài BigLake trong BigQuery lên Spanner

2. Thiết lập, yêu cầu và hạn chế

Điều kiện tiên quyết

Nếu tổ chức của bạn trên Google Cloud đã bật chính sách iam.allowedPolicyMemberDomains, thì quản trị viên có thể cần cấp một trường hợp ngoại lệ để cho phép tài khoản dịch vụ từ các miền bên ngoài. Chúng ta sẽ đề cập đến vấn đề này trong một bước sau (nếu có).

Yêu cầu

  • Một dự án trên Google Cloud đã bật tính năng thanh toán.
  • Một trình duyệt web, chẳng hạn như Chrome
  • Tài khoản Databricks (phòng thí nghiệm này giả định một không gian làm việc được lưu trữ trong GCP)
  • Phiên bản BigQuery phải là phiên bản Enterprise trở lên thì mới có thể sử dụng tính năng EXPORT DATA.
  • Nếu tổ chức của bạn trên Google Cloud đã bật chính sách iam.allowedPolicyMemberDomains, thì quản trị viên có thể cần cấp một trường hợp ngoại lệ để cho phép tài khoản dịch vụ từ các miền bên ngoài. Chúng ta sẽ đề cập đến vấn đề này trong một bước sau (nếu có).

Quyền IAM của Google Cloud Platform

Tài khoản Google sẽ cần có các quyền sau để thực hiện tất cả các bước trong lớp học lập trình này.

Tài khoản dịch vụ

iam.serviceAccountKeys.create

Cho phép tạo Tài khoản dịch vụ.

Spanner

spanner.instances.create

Cho phép tạo một phiên bản Spanner mới.

spanner.databases.create

Cho phép chạy các câu lệnh DDL để tạo

spanner.databases.updateDdl

Cho phép chạy câu lệnh DDL để tạo bảng trong cơ sở dữ liệu.

Google Cloud Storage

storage.buckets.create

Cho phép tạo một vùng lưu trữ GCS mới để lưu trữ các tệp Parquet đã xuất.

storage.objects.create

Cho phép ghi các tệp Parquet đã xuất vào bộ chứa GCS.

storage.objects.get

Cho phép BigQuery đọc các tệp Parquet trong vùng lưu trữ GCS.

storage.objects.list

Cho phép BigQuery liệt kê các tệp Parquet trong vùng lưu trữ GCS.

Dataflow

Dataflow.workitems.lease

Cho phép yêu cầu các mục công việc từ Dataflow.

Dataflow.workitems.sendMessage

Cho phép worker Dataflow gửi thông báo trở lại dịch vụ Dataflow.

Logging.logEntries.create

Cho phép các worker Dataflow ghi các mục nhật ký vào Google Cloud Logging.

Để thuận tiện, bạn có thể sử dụng các vai trò được xác định trước có chứa những quyền này.

roles/resourcemanager.projectIamAdmin

roles/iam.serviceAccountKeyAdmin

roles/spanner.instanceAdmin

roles/spanner.databaseAdmin

roles/storage.admin

roles/dataflow.serviceAgent

roles/dataflow.worker

roles/dataflow.serviceAgent

Dự án trên Google Cloud

Dự án là đơn vị tổ chức cơ bản trong Google Cloud. Nếu quản trị viên đã cung cấp một khoá để sử dụng, bạn có thể bỏ qua bước này.

Bạn có thể tạo một dự án bằng CLI như sau:

gcloud projects create <your-project-name>

Tìm hiểu thêm về cách tạo và quản lý dự án tại đây.

Các điểm hạn chế

Bạn cần lưu ý đến một số hạn chế và sự không tương thích về kiểu dữ liệu có thể xảy ra trong quy trình này.

Databricks Iceberg sang BigQuery

Khi sử dụng BigQuery để truy vấn các bảng Iceberg do Databricks quản lý (thông qua UniForm), hãy lưu ý những điều sau:

  • Phát triển giản đồ: Mặc dù UniForm có thể chuyển đổi các thay đổi về giản đồ Delta Lake sang Iceberg một cách hiệu quả, nhưng các thay đổi phức tạp có thể không phải lúc nào cũng lan truyền như mong đợi. Ví dụ: việc đổi tên các cột trong Delta Lake không được chuyển đổi sang Iceberg, vì Iceberg coi đó là một drop và một add. Luôn kiểm thử kỹ lưỡng các thay đổi về giản đồ.
  • Du hành thời gian: BigQuery không thể sử dụng các tính năng du hành thời gian của Delta Lake. Thao tác này sẽ chỉ truy vấn ảnh chụp nhanh mới nhất của bảng Iceberg.
  • Các tính năng không được hỗ trợ của Delta Lake: Các tính năng như Deletion Vectors (Vectơ xoá) và Column Mapping (Ánh xạ cột) ở chế độ id trong Delta Lake không tương thích với UniForm cho Iceberg. Phòng thí nghiệm sử dụng chế độ name để lập bản đồ cột và chế độ này được hỗ trợ.

BigQuery đến Spanner

Lệnh EXPORT DATA từ BigQuery đến Spanner không hỗ trợ tất cả các kiểu dữ liệu BigQuery. Việc xuất bảng có các loại sau sẽ dẫn đến lỗi:

  • STRUCT
  • GEOGRAPHY
  • DATETIME
  • RANGE
  • TIME

Ngoài ra, nếu dự án BigQuery đang sử dụng phương ngữ GoogleSQL, thì các kiểu số sau đây cũng không được hỗ trợ để xuất sang Spanner:

  • BIGNUMERIC

Để xem danh sách đầy đủ và mới nhất về các hạn chế, hãy tham khảo tài liệu chính thức: Các hạn chế khi xuất sang Spanner.

Khắc phục sự cố và các lỗi thường gặp

  • Nếu không có trên một phiên bản GCP Databricks, bạn có thể không xác định được Vị trí dữ liệu bên ngoài trong GCS. Trong những trường hợp như vậy, bạn sẽ cần dàn xếp các tệp trong giải pháp lưu trữ của nhà cung cấp dịch vụ đám mây của không gian làm việc Databricks, sau đó di chuyển riêng các tệp đó sang GCS.
  • Khi làm như vậy, bạn cần điều chỉnh siêu dữ liệu vì thông tin sẽ có các đường dẫn được mã hoá cứng đến các tệp được dàn dựng.

3. Thiết lập Google Cloud Storage (GCS)

Google Cloud Storage (GCS) sẽ được dùng để lưu trữ các tệp dữ liệu Parquet do Databricks tạo. Để làm như vậy, trước tiên, bạn cần tạo một vùng chứa mới để dùng làm đích đến của tệp.

Google Cloud Storage

Tạo một nhóm mới

  1. Chuyển đến trang Google Cloud Storage trong bảng điều khiển đám mây.
  2. Trên bảng điều khiển bên trái, hãy chọn Thùng chứa:

27f4bdfaba9bbd6a.png

  1. Nhấp vào nút Tạo:

e580967933f20cbf.png

  1. Điền thông tin chi tiết về nhóm:
  • Chọn tên nhóm tài nguyên để sử dụng. Đối với lớp học này, tên codelabs_retl_databricks sẽ được dùng
  • Chọn một khu vực để lưu trữ nhóm hoặc sử dụng các giá trị mặc định.
  • Giữ lớp lưu trữstandard
  • Giữ nguyên giá trị mặc định cho quyền kiểm soát
  • Giữ nguyên giá trị mặc định cho protect object data (bảo vệ dữ liệu đối tượng)
  1. Nhấp vào nút Create khi hoàn tất. Lời nhắc có thể xuất hiện để xác nhận rằng quyền truy cập công khai sẽ bị ngăn chặn. Hãy xác nhận.
  2. Chúc mừng bạn, bạn đã tạo thành công một vùng chứa mới! Bạn sẽ được chuyển hướng đến trang nhóm.
  • Sao chép tên nhóm mới vào một nơi nào đó vì bạn sẽ cần tên này sau.

cfe4c7b70868ecac.png

Chuẩn bị cho các bước tiếp theo

Hãy nhớ ghi lại những thông tin sau vì bạn sẽ cần đến chúng trong các bước tiếp theo:

  1. Mã dự án trên Google
  2. Tên bộ chứa Google Storage

4. Thiết lập Databricks

Dữ liệu TPC-H

Đối với lớp học lập trình này, chúng ta sẽ sử dụng tập dữ liệu TPC-H. Đây là điểm chuẩn theo tiêu chuẩn ngành cho các hệ thống hỗ trợ quyết định. Lược đồ này mô hình hoá một môi trường kinh doanh thực tế với khách hàng, đơn đặt hàng, nhà cung cấp và phụ tùng, khiến lược đồ này trở nên hoàn hảo để minh hoạ một kịch bản phân tích và di chuyển dữ liệu trong thế giới thực.

Thay vì sử dụng các bảng TPC-H thô, được chuẩn hoá, một bảng tổng hợp mới sẽ được tạo. Bảng mới này sẽ kết hợp dữ liệu từ các bảng orders, customernation để tạo ra một chế độ xem được tóm tắt và chuẩn hoá về doanh số bán hàng theo khu vực. Bước tổng hợp trước này là một phương pháp phổ biến trong hoạt động phân tích, vì bước này chuẩn bị dữ liệu cho một trường hợp sử dụng cụ thể – trong trường hợp này, để một ứng dụng vận hành sử dụng.

Giản đồ cuối cùng cho bảng tổng hợp sẽ là:

Col

Loại

nation_name

chuỗi

market_segment

chuỗi

order_year

int

order_priority

chuỗi

total_order_count

bigint

total_revenue

decimal(29,2)

unique_customer_count

bigint

Hỗ trợ Iceberg bằng Định dạng chung (UniForm) của Delta Lake

Đối với lớp học lập trình này, bảng trong Databricks sẽ là bảng Delta Lake. Tuy nhiên, để các hệ thống bên ngoài như BigQuery có thể đọc được, một tính năng mạnh mẽ có tên là Định dạng chung (UniForm) sẽ được bật.

UniForm tự động tạo siêu dữ liệu Iceberg cùng với siêu dữ liệu Delta Lake cho một bản sao dữ liệu duy nhất, dùng chung của bảng. Điều này mang lại những lợi ích tốt nhất của cả hai:

  • Trong Databricks: Bạn sẽ nhận được tất cả các lợi ích về hiệu suất và hoạt động quản trị của Delta Lake.
  • Bên ngoài Databricks: Mọi công cụ truy vấn tương thích với Iceberg (chẳng hạn như BigQuery) đều có thể đọc bảng này như thể đây là một bảng Iceberg gốc.

Nhờ đó, bạn không cần duy trì các bản sao dữ liệu riêng biệt hoặc chạy các tác vụ chuyển đổi theo cách thủ công. UniForm sẽ được bật bằng cách đặt các thuộc tính cụ thể của bảng khi bảng được tạo.

Danh mục Databricks

Danh mục Databricks là vùng chứa cấp cao nhất cho dữ liệu trong Unity Catalog, giải pháp quản trị hợp nhất của Databricks. Unity Catalog cung cấp một cách tập trung để quản lý tài sản dữ liệu, kiểm soát quyền truy cập và theo dõi dòng dữ liệu. Đây là những yếu tố quan trọng đối với một nền tảng dữ liệu được quản lý tốt.

Thư viện này sử dụng không gian tên gồm 3 cấp để sắp xếp dữ liệu: catalog.schema.table.

  • Danh mục: Cấp cao nhất, dùng để nhóm dữ liệu theo môi trường, đơn vị kinh doanh hoặc dự án.
  • Lược đồ (hoặc Cơ sở dữ liệu): Một nhóm logic gồm các bảng, chế độ xem và hàm trong một danh mục.
  • Bảng: Đối tượng chứa dữ liệu của bạn.

Trước khi có thể tạo bảng TPC-H tổng hợp, bạn phải thiết lập một danh mục và giản đồ chuyên dụng để lưu trữ bảng đó. Điều này giúp đảm bảo dự án được sắp xếp gọn gàng và tách biệt với các dữ liệu khác trong không gian làm việc.

Tạo Danh mục và Lược đồ mới

Trong Databricks Unity Catalog, Danh mục đóng vai trò là cấp tổ chức cao nhất cho các tài sản dữ liệu, hoạt động như một vùng chứa bảo mật có thể trải rộng trên nhiều không gian làm việc của Databricks. Nhờ đó, bạn có thể sắp xếp và tách biệt dữ liệu dựa trên các đơn vị kinh doanh, dự án hoặc môi trường, với các quyền và chế độ kiểm soát quyền truy cập được xác định rõ ràng.

Trong một Danh mục, một Lược đồ (còn được gọi là cơ sở dữ liệu) sẽ sắp xếp thêm các bảng, khung hiển thị và hàm. Cấu trúc phân cấp này cho phép kiểm soát chi tiết và nhóm một cách hợp lý các đối tượng dữ liệu có liên quan. Đối với phòng thí nghiệm này, một Danh mục và Lược đồ chuyên dụng sẽ được tạo để lưu trữ dữ liệu TPC-H, đảm bảo việc cách ly và quản lý đúng cách.

Tạo danh mục
  1. Chuyển đến 6761500bb3aaa502.png
  2. Nhấp vào biểu tượng + rồi chọn Tạo danh mục trong trình đơn thả xuống

13cfc62741161182.png

  1. Một danh mục Chuẩn mới sẽ được tạo với các chế độ cài đặt sau:
  • Tên danh mục: retl_tpch_project
  • Vị trí lưu trữ: Sử dụng vị trí mặc định nếu bạn đã thiết lập một vị trí trong không gian làm việc hoặc tạo một vị trí mới.

a6e3c89febde9a77.png

Tạo giản đồ
  1. Chuyển đến 6761500bb3aaa502.png
  2. Chọn danh mục mới được tạo trong bảng điều khiển bên trái

89d2935ac4c5d655.png

  1. Nhấp vào biểu tượng b7a6fc9785ac3a9d.png
  2. Một giản đồ mới sẽ được tạo với Tên giản đồtpch_data

787631de85a6bb9.png

Thiết lập dữ liệu bên ngoài

Để có thể xuất dữ liệu từ Databricks sang Google Cloud Storage (GCS), bạn cần thiết lập thông tin đăng nhập dữ liệu bên ngoài trong Databricks. Điều này cho phép Databricks truy cập và ghi vào bộ chứa GCS một cách an toàn.

  1. Trên màn hình Danh mục, hãy nhấp vào biểu tượng 32d5a94ae444cd8e.png
  • Nếu không thấy biểu tượng External Data, bạn có thể thấy biểu tượng External Locations trong trình đơn thả xuống Connect.
  1. Nhấp vào biểu tượng e03562324c0ba85e.png
  2. Trong cửa sổ hộp thoại mới, hãy thiết lập các giá trị bắt buộc cho thông tin đăng nhập:
  • Loại thông tin đăng nhập: GCP Service Account
  • Tên thông tin xác thực: retl-gcs-credential

7be8456dfa196853.png

  1. Nhấp vào Tạo
  2. Tiếp theo, hãy nhấp vào thẻ Vị trí bên ngoài.
  3. Nhấp vào Tạo vị trí.
  4. Trong cửa sổ hộp thoại mới, hãy thiết lập các giá trị bắt buộc cho vị trí bên ngoài:
  • Tên vị trí bên ngoài: retl-gcs-location
  • Loại bộ nhớ: GCP
  • URL: URL của vùng lưu trữ GCS, có định dạng gs://YOUR_BUCKET_NAME
  • Thông tin xác thực bộ nhớ: Chọn retl-gcs-credential mà bạn vừa tạo.

6d9240128dfcfd80.png

  1. Ghi lại email Tài khoản dịch vụ được điền tự động khi bạn chọn thông tin đăng nhập bộ nhớ vì bạn sẽ cần đến thông tin này ở bước tiếp theo.
  1. Nhấp vào Tạo

5. Thiết lập quyền cho tài khoản dịch vụ

Tài khoản dịch vụ là một loại tài khoản đặc biệt mà các ứng dụng hoặc dịch vụ dùng để thực hiện các lệnh gọi API được uỷ quyền đến các tài nguyên trên Google Cloud.

Giờ đây, bạn cần thêm quyền vào tài khoản dịch vụ được tạo cho bộ chứa mới trong GCS.

  1. Trên trang bộ chứa GCS, hãy chọn thẻ Quyền.

240e591122612db0.png

  1. Nhấp vào Cấp quyền truy cập trong trang người đại diện
  2. Trong bảng Cấp quyền truy cập trượt ra từ bên phải, hãy nhập Mã nhận dạng tài khoản dịch vụ vào trường Bên giao đại lý mới
  3. Trong phần Chỉ định vai trò, hãy thêm Storage Object AdminStorage Legacy Bucket Reader. Các vai trò này cho phép Tài khoản dịch vụ đọc, ghi và liệt kê các đối tượng trong bộ chứa lưu trữ.

Tải dữ liệu TPC-H

Giờ đây, sau khi Danh mục và Giản đồ được tạo, dữ liệu TPCH có thể được tải từ bảng samples.tpch hiện có được lưu trữ nội bộ trong Databricks và được thao tác thành một bảng mới trong giản đồ mới xác định.

Tạo bảng có hỗ trợ Iceberg

Khả năng tương thích của Iceberg với UniForm

Đằng sau hậu trường, Databricks quản lý nội bộ bảng này dưới dạng bảng Delta Lake, mang lại tất cả lợi ích của các tính năng tối ưu hoá hiệu suất và quản trị của Delta trong hệ sinh thái Databricks. Tuy nhiên, bằng cách bật UniForm (viết tắt của Universal Format – Định dạng chung), Databricks sẽ được hướng dẫn thực hiện một việc đặc biệt: mỗi khi bảng được cập nhật, Databricks sẽ tự động tạo và duy trì siêu dữ liệu Iceberg tương ứng ngoài siêu dữ liệu Delta Lake.

Điều này có nghĩa là một tập hợp tệp dữ liệu dùng chung (tệp Parquet) hiện được mô tả bằng hai tập hợp siêu dữ liệu khác nhau.

  • Đối với Databricks: Công cụ này sử dụng _delta_log để đọc bảng.
  • Đối với Trình đọc bên ngoài (chẳng hạn như BigQuery): Các trình đọc này sử dụng tệp siêu dữ liệu Iceberg (.metadata.json) để hiểu giản đồ, việc phân vùng và vị trí tệp của bảng.

Kết quả là một bảng tương thích hoàn toàn và minh bạch với mọi công cụ có hỗ trợ Iceberg. Không có dữ liệu trùng lặp và bạn không cần chuyển đổi hoặc đồng bộ hoá theo cách thủ công. Đây là một nguồn thông tin duy nhất mà cả thế giới phân tích của Databricks và hệ sinh thái công cụ rộng lớn hơn hỗ trợ tiêu chuẩn Iceberg mở đều có thể truy cập một cách liền mạch.

  1. Nhấp vào Mới rồi nhấp vào Truy vấn

d5fad2076e475ebe.png

  1. Trong trường văn bản của trang truy vấn, hãy chạy lệnh SQL sau:
CREATE TABLE retl_tpch_project.tpch_data.regional_sales_iceberg
USING DELTA
LOCATION 'gs://<Your bucket name>/regional_sales_iceberg'
TBLPROPERTIES (
  'delta.columnMapping.mode' = 'name',
  'delta.enableIcebergCompatV2' = 'true',
  'delta.universalFormat.enabledFormats' = 'iceberg'
)
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 
    n.n_name, 
    c.c_mktsegment, 
    YEAR(o.o_orderdate), 
    o.o_orderpriority;

OPTIMIZE retl_tpch_project.tpch_data.regional_sales_iceberg;

DESCRIBE EXTENDED retl_tpch_project.tpch_data.regional_sales_iceberg;

Lưu ý:

  • Sử dụng Delta – Chỉ định rằng chúng ta đang sử dụng Bảng Delta Lake. Chỉ các bảng Delta Lake trong Databricks mới có thể được lưu trữ dưới dạng bảng bên ngoài.
  • Location (Vị trí) – Chỉ định nơi lưu trữ bảng (nếu là bảng bên ngoài).
  • TablePropertoesdelta.universalFormat.enabledFormats = ‘iceberg' tạo siêu dữ liệu iceberg tương thích cùng với các tệp Delta Lake.
  • Optimize (Tối ưu hoá) – Buộc kích hoạt quá trình tạo siêu dữ liệu UniForm, vì quá trình này thường diễn ra không đồng bộ.
  1. Đầu ra của truy vấn sẽ cho thấy thông tin chi tiết về bảng mới tạo

285c622214824bc.png

Xác minh dữ liệu bảng GCS

Sau khi chuyển đến vùng lưu trữ GCS, bạn có thể tìm thấy dữ liệu bảng mới tạo.

Bạn sẽ thấy siêu dữ liệu Iceberg trong thư mục metadata. Thư mục này được các trình đọc bên ngoài (chẳng hạn như BigQuery) sử dụng. Siêu dữ liệu Delta Lake mà Databricks sử dụng nội bộ được theo dõi trong thư mục _delta_log.

Dữ liệu bảng thực tế được lưu trữ dưới dạng tệp Parquet trong một thư mục khác, thường được Databricks đặt tên bằng một chuỗi được tạo ngẫu nhiên. Ví dụ: trong ảnh chụp màn hình bên dưới, các tệp dữ liệu nằm trong thư mục 9M.

e9c1dfecb7b6af05.png

6. Thiết lập BigQuery và BigLake

Giờ đây, khi bảng Iceberg đã có trong Google Cloud Storage, bước tiếp theo là cấp quyền truy cập cho BigQuery. Việc này sẽ được thực hiện bằng cách tạo một bảng bên ngoài BigLake.

BigLake là một công cụ lưu trữ cho phép tạo các bảng trong BigQuery để đọc dữ liệu trực tiếp từ các nguồn bên ngoài như Google Cloud Storage. Đối với phòng thí nghiệm này, đây là công nghệ chính giúp BigQuery hiểu được bảng Iceberg vừa được xuất mà không cần phải nhập dữ liệu.

Để làm được việc này, bạn cần có 2 thành phần:

  1. Mối kết nối tài nguyên trên đám mây: Đây là mối liên kết bảo mật giữa BigQuery và GCS. Dịch vụ này sử dụng một tài khoản dịch vụ đặc biệt để xử lý việc xác thực, đảm bảo BigQuery có các quyền cần thiết để đọc tệp từ vùng chứa GCS.
  2. Định nghĩa bảng bên ngoài: Định nghĩa này cho BigQuery biết vị trí tìm tệp siêu dữ liệu của bảng Iceberg trong GCS và cách diễn giải tệp đó.

Tạo mối kết nối tài nguyên trên đám mây

Trước tiên, hệ thống sẽ tạo kết nối cho phép BigQuery truy cập vào GCS.

Bạn có thể xem thêm thông tin về cách tạo Cloud Resource Connections tại đây

  1. Chuyển đến BigQuery
  2. Nhấp vào Connections (Kết nối) trong Explorer (Trình khám phá)
  • Nếu mặt phẳng Explorer (Trình khám phá) không xuất hiện, hãy nhấp vào biểu tượng e09eaea936f28d62.png

3b64ad1e030299e5.png

  1. Trên trang Kết nối, hãy nhấp vào biểu tượng 6b81c7550b537890.png
  2. Đối với Loại kết nối, hãy chọn Vertex AI remote models, remote functions, BigLake and Spanner (Cloud Resource)
  3. Đặt mã nhận dạng kết nối thành databricks_retl và tạo kết nối

a0c9030883e6fb2.png

7aa50f0ee61d7b67.png

  1. Giờ đây, bạn sẽ thấy một mục trong bảng Connections (Kết nối) của mối kết nối mới tạo. Nhấp vào mục đó để xem thông tin chi tiết về mối kết nối.

3cf84a65e626ccfe.png

  1. Trong trang thông tin chi tiết về mối kết nối, hãy ghi lại Mã tài khoản dịch vụ vì bạn sẽ cần mã này sau này.

7f52106c43700b78.png

Cấp quyền truy cập cho tài khoản dịch vụ kết nối

  1. Chuyển đến phần IAM & Admin (Quản trị và quản lý danh tính và quyền truy cập)
  2. Nhấp vào Cấp quyền truy cập

d8fc7690bba820c7.png

  1. Đối với trường Bên giao đại lý mới, hãy nhập Mã tài khoản dịch vụ của Tài nguyên kết nối mà bạn đã tạo ở trên.
  2. Đối với Vai trò, hãy chọn Storage Object User rồi nhấp vào 9e23819e5bc1babb.png

Sau khi thiết lập kết nối và cấp cho tài khoản dịch vụ của kết nối các quyền cần thiết, bạn có thể tạo bảng bên ngoài BigLake. Trước tiên, bạn cần có một Tập dữ liệu trong BigQuery để đóng vai trò là một vùng chứa cho bảng mới. Sau đó, chính bảng sẽ được tạo, trỏ đến tệp siêu dữ liệu Iceberg trong vùng chứa GCS.

  1. Chuyển đến BigQuery
  2. Trong bảng Explorer (Trình khám phá), hãy nhấp vào mã dự án, sau đó nhấp vào dấu ba chấm rồi chọn Create dataset (Tạo tập dữ liệu).

9ef91b1c8433b641.png

  1. Tập dữ liệu sẽ có tên là databricks_retl. Giữ nguyên các lựa chọn khác theo mặc định rồi nhấp vào nút Tạo tập dữ liệu.

9f413d6f65520b2f.png

  1. Giờ đây, hãy tìm tập dữ liệu databricks_retl mới trong bảng điều khiển Explorer (Trình khám phá). Nhấp vào biểu tượng ba dấu chấm bên cạnh rồi chọn Tạo bảng.

858cb483ebd3ce2a.png

  1. Điền vào các chế độ cài đặt sau để tạo bảng:
  • Tạo bảng từ: Google Cloud Storage
  • Chọn tệp trong vùng lưu trữ GCS hoặc sử dụng mẫu URI: Duyệt tìm vùng lưu trữ GCS và xác định tệp JSON siêu dữ liệu đã được tạo trong quá trình xuất Databricks. Đường dẫn sẽ có dạng như sau: regional_sales/metadata/v1.metadata.json.
  • Định dạng tệp: Iceberg
  • Bảng: regional_sales
  • Loại bảng: External table
  • Mã nhận dạng kết nối: Chọn kết nối databricks_retl mà bạn đã tạo trước đó.
  • Để nguyên các giá trị còn lại ở chế độ mặc định, sau đó nhấp vào Tạo bảng.
  1. Sau khi tạo, bạn sẽ thấy bảng regional_sales mới trong tập dữ liệu databricks_retl. Giờ đây, bạn có thể truy vấn bảng này bằng SQL chuẩn, giống như với mọi bảng BigQuery khác.

133be43ad67a5a21.png

7. Tải vào Spanner

Bạn đã đạt đến phần cuối cùng và quan trọng nhất của quy trình: di chuyển dữ liệu từ các bảng bên ngoài BigLake vào Spanner. Đây là bước "ETL đảo ngược", trong đó dữ liệu sau khi được xử lý và tuyển chọn trong kho dữ liệu sẽ được tải vào một hệ thống vận hành để các ứng dụng sử dụng.

Spanner là một cơ sở dữ liệu quan hệ được quản lý toàn bộ và phân phối trên toàn cầu. Dịch vụ này mang đến tính nhất quán giao dịch của một cơ sở dữ liệu quan hệ truyền thống nhưng có khả năng mở rộng theo chiều ngang của một cơ sở dữ liệu NoSQL. Nhờ đó, đây là lựa chọn lý tưởng để tạo các ứng dụng có khả năng mở rộng và tính sẵn sàng cao.

Quy trình sẽ như sau:

  1. Tạo một phiên bản Spanner, đây là việc phân bổ tài nguyên thực tế.
  2. Tạo một cơ sở dữ liệu trong phiên bản đó.
  3. Xác định một giản đồ bảng trong cơ sở dữ liệu khớp với cấu trúc của dữ liệu regional_sales.
  4. Chạy truy vấn BigQuery EXPORT DATA để tải dữ liệu từ bảng BigLake trực tiếp vào bảng Spanner.

Tạo thực thể, cơ sở dữ liệu và bảng Spanner

  1. Chuyển đến Spanner
  2. Nhấp vào 6a261f186de0bf4a.png . Bạn có thể sử dụng một phiên bản hiện có (nếu có). Thiết lập các yêu cầu về phiên bản nếu cần. Trong phòng thí nghiệm này, chúng tôi đã sử dụng những thứ sau:

Phiên bản

Doanh nghiệp

Tên phiên bản

databricks-retl

Cấu hình khu vực

Khu vực bạn chọn

Đơn vị điện toán

Đơn vị xử lý (PU)

Phân bổ thủ công

100

  1. Sau khi tạo, hãy chuyển đến trang phiên bản Spanner rồi chọn 99e50c2015c697f4.png. Bạn có thể sử dụng cơ sở dữ liệu hiện có (nếu có).
  • Đối với lớp học lập trình này, một cơ sở dữ liệu sẽ được tạo bằng
  • Tên:databricks-retl
  • Ngôn ngữ cơ sở dữ liệu: Google Standard SQL
  1. Sau khi tạo cơ sở dữ liệu, hãy chọn cơ sở dữ liệu đó trên trang Spanner Instance (Phiên bản Spanner) để truy cập vào trang Spanner Database (Cơ sở dữ liệu Spanner).
  2. Trên trang Cơ sở dữ liệu Spanner, hãy nhấp vào 1df26c863b1327d5.png
  3. Trong trang truy vấn mới, định nghĩa bảng cho bảng cần nhập vào Spanner sẽ được tạo. Để thực hiện việc này, hãy chạy truy vấn SQL sau.
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);
  1. Sau khi lệnh SQL thực thi, bảng Spanner sẽ sẵn sàng để BigQuery thực hiện ETL đảo ngược dữ liệu. Bạn có thể xác minh việc tạo bảng bằng cách xem bảng đó trong bảng điều khiển bên trái trong cơ sở dữ liệu Spanner.

baf4caec5c236f4f.png

Reverse ETL sang Spanner bằng EXPORT DATA

Đây là bước cuối cùng. Khi dữ liệu nguồn đã sẵn sàng trong bảng BigLake của BigQuery và bảng đích được tạo trong Spanner, quá trình di chuyển dữ liệu thực tế diễn ra rất đơn giản. Một truy vấn SQL BigQuery sẽ được dùng: EXPORT DATA.

Truy vấn này được thiết kế riêng cho những trường hợp như vậy. Công cụ này xuất dữ liệu một cách hiệu quả từ một bảng BigQuery (bao gồm cả các bảng bên ngoài như bảng BigLake) sang một đích đến bên ngoài. Trong trường hợp này, đích đến là bảng Spanner. Bạn có thể xem thêm thông tin về tính năng xuất tại đây

Bạn có thể xem thêm thông tin về cách thiết lập BigQuery thành Spanner Reverse ETL tại đây

  1. Chuyển đến BigQuery
  2. Mở một thẻ trình chỉnh sửa truy vấn mới.
  3. Trên trang Truy vấn, hãy nhập SQL sau. Hãy nhớ thay thế mã dự án trong **uri** **và đường dẫn bảng bằng mã dự án chính xác.**
EXPORT DATA OPTIONS(

uri='https://spanner.googleapis.com/projects/YOUR_PROJECT_ID/instances/databricks-retl/databases/databricks-retl',
  format='CLOUD_SPANNER',
   spanner_options="""{
      "table": "regional_sales",
      "priority": "MEDIUM"
  }"""
) AS

SELECT * FROM `YOUR_PROJECT_ID.databricks_retl.regional_sales`;
  1. Sau khi lệnh hoàn tất, dữ liệu đã được xuất thành công sang Spanner!

8. Xác minh dữ liệu trong Spanner

Xin chúc mừng! Một quy trình ETL đảo ngược hoàn chỉnh đã được xây dựng và thực thi thành công, di chuyển dữ liệu từ kho dữ liệu Databricks sang cơ sở dữ liệu Spanner hoạt động.

Bước cuối cùng là xác minh rằng dữ liệu đã được chuyển đến Spanner như dự kiến.

  1. Chuyển đến Spanner.
  2. Chuyển đến phiên bản databricks-retl của bạn, rồi chuyển đến cơ sở dữ liệu databricks-retl.
  3. Trong danh sách bảng, hãy nhấp vào bảng regional_sales.
  4. Trong trình đơn điều hướng bên trái của bảng, hãy nhấp vào thẻ Dữ liệu.

710e41c80bdc31c4.png

  1. Dữ liệu bán hàng tổng hợp (ban đầu từ Databricks) hiện đã được tải và sẵn sàng sử dụng trong bảng Spanner. Dữ liệu này hiện nằm trong một hệ thống vận hành, sẵn sàng hỗ trợ một ứng dụng đang hoạt động, cung cấp một trang tổng quan hoặc được truy vấn bằng một API.

f1201d6605b2a527.png

Khoảng cách giữa thế giới dữ liệu phân tích và dữ liệu vận hành đã được thu hẹp thành công.

9. Dọn dẹp

Xoá tất cả các bảng đã thêm và dữ liệu đã lưu trữ khi bạn hoàn tất bài thực hành này.

Dọn dẹp các bảng Spanner

  1. Chuyển đến Spanner (Cờ lê móc)
  2. Nhấp vào phiên bản đã dùng cho bài thực hành này trong danh sách có tên databricks-retl

aa32380b601fdb87.png

  1. Trong trang phiên bản, hãy nhấp vào biểu tượng 5fc4696b82a79013.png
  2. Nhập databricks-retl vào hộp thoại xác nhận bật lên rồi nhấp vào ef9e3709dcad2683.png

Dọn dẹp GCS

  1. Chuyển đến GCS
  2. Chọn biểu tượng b0aeb28c98f21942.png trong trình đơn bên trái
  3. Chọn vùng chứa ``codelabs_retl_databricks

e4f33fbebb892229.png

  1. Sau khi chọn, hãy nhấp vào nút 1f0075ce292003ff.png xuất hiện ở biểu ngữ trên cùng

384fe0801a23bfe5.png

  1. Nhập DELETE vào hộp thoại xác nhận bật lên rồi nhấp vào ef9e3709dcad2683.png

Dọn dẹp Databricks

Xoá danh mục/lược đồ/bảng

  1. Đăng nhập vào phiên bản Databricks
  2. Nhấp vào biểu tượng 20bae9c2c9097306.png trong trình đơn bên trái
  3. Chọn fc566eb3fddd7477.png đã tạo trước đó trong danh sách danh mục
  4. Trong danh sách Lược đồ, hãy chọn deb927c01e9e76d0.png mà bạn đã tạo
  5. Chọn 332d33ee48a5897c.png đã tạo trước đó trong danh sách bảng
  6. Mở rộng các lựa chọn về bảng bằng cách nhấp vào df6dbe6356f141c6.png rồi chọn Delete
  7. Nhấp vào biểu tượng 3951711057fe3048.png trên hộp thoại xác nhận để xoá bảng
  8. Sau khi xoá bảng, bạn sẽ được đưa trở lại trang giản đồ
  9. Mở rộng các lựa chọn về giản đồ bằng cách nhấp vào df6dbe6356f141c6.png rồi chọn Delete
  10. Nhấp vào biểu tượng 3951711057fe3048.png trên hộp thoại xác nhận để xoá Lược đồ
  11. Sau khi xoá giản đồ, bạn sẽ được đưa trở lại trang danh mục
  12. Lặp lại các bước từ 4 đến 11 để xoá giản đồ default (nếu có).
  13. Trên trang danh mục, hãy mở rộng các lựa chọn về danh mục bằng cách nhấp vào df6dbe6356f141c6.png rồi chọn Delete
  14. Nhấp vào biểu tượng 3951711057fe3048.png trên hộp thoại xác nhận để xoá danh mục

Xoá vị trí / thông tin đăng nhập của dữ liệu bên ngoài

  1. Trên màn hình Danh mục, hãy nhấp vào biểu tượng 32d5a94ae444cd8e.png
  2. Nếu không thấy biểu tượng External Data, bạn có thể thấy biểu tượng External Location trong trình đơn thả xuống Connect.
  3. Nhấp vào vị trí dữ liệu bên ngoài retl-gcs-location mà bạn đã tạo trước đó
  4. Trên trang vị trí bên ngoài, hãy mở rộng các lựa chọn vị trí bằng cách nhấp vào df6dbe6356f141c6.png rồi chọn Delete
  5. Nhấp vào biểu tượng 3951711057fe3048.png trên hộp thoại xác nhận để xoá vị trí bên ngoài
  6. Nhấp vào biểu tượng e03562324c0ba85e.png
  7. Nhấp vào retl-gcs-credential đã được tạo trước đó
  8. Trên trang thông tin xác thực, hãy mở rộng các lựa chọn thông tin xác thực bằng cách nhấp vào df6dbe6356f141c6.png rồi chọn Delete
  9. Nhấp vào biểu tượng 3951711057fe3048.png trên hộp thoại xác nhận để xoá thông tin đăng nhập.

10. Xin chúc mừng

Chúc mừng bạn đã hoàn thành lớp học lập trình này.

Nội dung đã đề cập

  • Cách tải dữ liệu vào Databricks dưới dạng bảng Iceberg
  • Cách tạo một Nhóm lưu trữ GCS
  • Cách xuất bảng Databricks sang GCS ở định dạng Iceberg
  • Cách tạo Bảng bên ngoài BigLake trong BigQuery từ bảng Iceberg trong GCS
  • Cách thiết lập một phiên bản Spanner
  • Cách tải Bảng bên ngoài BigLake trong BigQuery lên Spanner