Ngân hàng đề — Google Cloud Associate Data Practitioner

Tìm thấy 333 câu.

Câu 211 Data Management

A company is setting up a new Cloud Storage bucket to store analytics data. The data will be frequently accessed by a team of analysts and a suite of applications all located in the europe-west1 (Belgium) region.

To ensure the best performance and lowest cost, what is the most appropriate location type for this bucket?

  1. A Dual-region
  2. B Regional
  3. C Zonal
  4. D Multi-region
Xem giải thích

Đáp án

B — Regional.

Vì sao đúng

Đề nêu ba điều: cả nhà phân tích lẫn ứng dụng đều ở europe-west1, và mục tiêu là hiệu năng tốt nhất với chi phí thấp nhất. Khi người dùng tập trung ở một Region, đặt dữ liệu ngay tại đó là lựa chọn tối ưu.

⚠ Điểm mấu chốt — đặt dữ liệu cạnh nơi xử lý:

Bucket ở europe-west1
    + ứng dụng và phân tích cũng ở europe-west1
        ↓
    → độ trễ THẤP NHẤT
    → KHÔNG có phí truyền dữ liệu
      giữa các Region
    → giá lưu trữ RẺ NHẤT
        ↓
    ⚠ Ba lợi ích cùng lúc

⚠ Vì sao multi-region lại KÉM hơn ở đây:

Multi-region EU
        ↓
    ⚠ ĐẮT HƠN về giá lưu
    ⚠ Không cần thiết — người dùng
      chỉ ở một Region
    ⚠ Truy cập từ europe-west1 có thể
      không nhanh hơn regional tại chỗ
        ↓
    → trả tiền cho tính sẵn sàng
      mà đề không yêu cầu

⚠ Quy tắc chọn vị trí bucket:

Người dùng và ứng dụng ở MỘT Region
    → REGIONAL                      ← đề này

Cần chịu lỗi cả một Region
    → DUAL-REGION hoặc MULTI-REGION

Người dùng phân tán NHIỀU CHÂU LỤC
    → MULTI-REGION + CLOUD CDN

Dữ liệu phải ở trong một nước
    → REGION cụ thể + Organization Policy

Xem thêm câu #13119 (cùng lô): khoá Multi-region vì ở đó yêu cầu chịu được mất cả một Region. Hai khoá khác nhau vì yêu cầu khác nhau — hoàn toàn nhất quán. Và #12921 (lô 133): cùng khoá regional cho người dùng ở Úc. #12967 (lô 134): multi-region + CDN cho người dùng đa châu lục.

Vì sao các phương án khác sai

  • D (multi-region) — đây là phương án gần nhất về mặt "an toàn hơn", nhưng nó đắt hơn và không cần thiết khi người dùng chỉ ở một Region; đề nhấn mạnh chi phí thấp nhất.

  • A (dual-region) — cũng đắt hơn regional, và đề không yêu cầu chịu lỗi Region.

  • C (zonal) — Cloud Storage KHÔNG có kiểu vị trí này.

Ghi nhớ

⚠ Chọn vị trí bucket theo phạm vi người dùng — bảng phải thuộc: | Người dùng ở | Chọn | |---|---| | Một Region | REGIONAL — rẻ nhất, nhanh nhất tại chỗ | | Hai Region cụ thể | dual-region | | Một châu lục | multi-region | | Nhiều châu lục | multi-region + Cloud CDN | | Cần chịu lỗi cả Region | dual-region hoặc multi-region | | ⚠ Bẫy | KHÔNG có kiểu "zonal" |

Từ khoá nhận diện:

"người dùng ở một Region, hiệu năng và chi phí" → regional "chịu được mất cả Region" → multi-region "nhiều châu lục" → multi-region + CDN "dữ liệu ở trong nước" → region cụ thể "zonal cho Cloud Storage" → KHÔNG TỒN TẠI

Vì sao "cùng Region" lại quan trọng Lý do
Độ trễ thấp dữ liệu và xử lý cạnh nhau
KHÔNG có phí egress giữa Region khoản này dễ bị bỏ sót
Thông lượng cao hơn mạng nội bộ
Giá lưu rẻ hơn regional rẻ nhất
Áp dụng cho BigQuery dataset, Dataflow, GKE — đặt CÙNG Region
Regional vẫn an toàn tới mức nào Nội dung
Dữ liệu nhân bản qua các ZONE trong Region
→ chịu được hỏng một zone
Độ bền 11 số 9 như mọi kiểu vị trí
SLA sẵn sàng 99,9% (Standard)
⚠ Không chịu được mất HOÀN TOÀN một Region
Nếu về sau cần sẵn sàng cao hơn Cách
Sao chép sang bucket ở Region khác Storage Transfer Service theo lịch
Chuyển sang dual-region phải tạo bucket mới
Cloud CDN nếu vấn đề là độ trễ cho người dùng xa
⚠ Lưu ý vị trí KHÔNG đổi được — phải tạo mới và chép
Vì vậy cân nhắc kỹ ngay lần đầu
Đặt mọi thứ cùng Region — danh sách kiểm Dịch vụ
Bucket Cloud Storage --location=europe-west1
BigQuery dataset --location=europe-west1
Dataflow, Dataproc --region=europe-west1
Cloud Run, GKE cùng Region
Cloud KMS key ring cùng Region nếu dùng CMEK
Lợi ích độ trễ thấp và không phí truyền giữa Region

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bucket ở đâu | gcloud storage buckets describe gs://b --format="value(location)" | | Có phí egress giữa Region không | billing export, tìm SKU network | | Độ trễ thực tế | đo từ chính ứng dụng |

Và một khoản chi phí rất hay xuất hiện bất ngờ trong hoá đơn khi vị trí không được đặt nhất quán: phí truyền dữ liệu giữa các Region. Một bucket ở multi-region EU và một job Dataflow ở europe-west1 vẫn chạy bình thường, nhưng mỗi byte đi qua ranh giới đó đều được tính tiền — và với dữ liệu phân tích hằng ngày, khoản đó tích luỹ nhanh hơn nhiều so với phần tiết kiệm được từ bất kỳ tối ưu nào khác.

Câu 212 Data Pipeline Orchestration

A developer needs to build a reliable, serverless orchestration that chains together several idempotent HTTP (Hypertext Transfer Protocol) API calls. The workflow must pass outputs from one step to the next and include automatic retries. A primary requirement is to use a service that does not require managing or provisioning an Apache Airflow environment.

Which service is the best fit?

  1. A Eventarc
  2. B Cloud Composer
  3. C Cloud Workflows
  4. D Cloud Functions
Xem giải thích

Đáp án

C — Cloud Workflows.

Vì sao đúng

Đề nêu bốn điều: nối chuỗi vài lời gọi HTTP API bất biến, truyền kết quả từ bước này sang bước kia, tự thử lại, và — quan trọng nhất — KHÔNG phải quản lý hay cấp phát môi trường Apache Airflow. Cloud Workflows khớp cả bốn.

⚠ Điểm mấu chốt — điều phối nhẹ, không có môi trường thường trực:

Cloud Workflows
        ↓
    Khai bằng YAML hoặc JSON
        ↓
    - Gọi HTTP API tuần tự
    - TRUYỀN kết quả giữa các bước
    - THỬ LẠI có backoff
    - Rẽ nhánh, vòng lặp, xử lý lỗi
        ↓
    ⚠ KHÔNG có môi trường thường trực
    ⚠ Trả tiền theo SỐ BƯỚC thực hiện

⚠ Một workflow trông thế nào:

main:
  steps:
    - buoc1:
        call: http.post
        args:
          url: https://api-a.example.com/xu-ly
          auth: {type: OIDC}
        result: ket_qua_a
    - buoc2:
        call: http.post
        args:
          url: https://api-b.example.com/tiep
          body:
            du_lieu: ${ket_qua_a.body.id}
        result: ket_qua_b
    - tra_ve:
        return: ${ket_qua_b.body}
        ↓
    ⚠ `${ket_qua_a.body.id}` chính là
      TRUYỀN KẾT QUẢ giữa các bước

⚠ Vì sao Cloud Composer bị loại:

Cloud Composer = Apache Airflow được quản lý
        ↓
    ⚠ Vẫn phải TẠO và DUY TRÌ một
      MÔI TRƯỜNG thường trực
    ⚠ Chi phí nền đáng kể
        ↓
    Đề nói rõ: "KHÔNG cần quản lý
    hay cấp phát môi trường Airflow"
        ↓
    → loại bỏ tường minh

Xem thêm câu #13015 (lô 135), #12996 và #13003 (lô 135): khoá Cloud Composer vì ở đó luồng phức tạp, nhiều dịch vụ, cần backfill và DAG đầy đủ. Câu này là chuỗi vài lời gọi API nhẹ và loại trừ Airflow tường minh → Workflows. Bốn câu, hai khoá, phân biệt bằng ĐỘ PHỨC TẠP và ràng buộc trong đề — hoàn toàn nhất quán.

Vì sao các phương án khác sai

  • B (Cloud Composer) — đây là phương án gần nhất và hoàn toàn làm được, nhưng đề loại trừ tường minh việc phải quản lý môi trường Airflow.

  • D (Cloud Functions) — chạy một đoạn mã; nối chuỗi nhiều bước bằng hàm là tự viết lại logic điều phối (thử lại, truyền trạng thái, xử lý lỗi).

  • A (Eventarc) — định tuyến SỰ KIỆN tới một đích, không phải bộ điều phối nhiều bước.

Ghi nhớ

⚠ Thang công cụ điều phối — từ nhẹ tới nặng: | Công cụ | Đặc điểm | |---|---| | Cloud Scheduler | một lời gọi theo giờ | | Eventarc | định tuyến một sự kiện tới một đích | | Cloud Workflows | chuỗi vài bước, YAML, KHÔNG có môi trường thường trực | | Cloud Composer | DAG đầy đủ, backfill, môi trường thường trực | | Dataform | chuỗi bước SQL trong BigQuery | | Dataproc Workflow Template | nhiều job trong Dataproc |

Từ khoá nhận diện:

"chuỗi API, truyền kết quả, không muốn Airflow" → Cloud Workflows "DAG phức tạp, nhiều dịch vụ, backfill" → Cloud Composer "một lời gọi theo giờ" → Cloud Scheduler "phản ứng theo sự kiện" → Eventarc "chỉ toàn SQL" → Dataform

Cloud Workflows — tính năng Tính năng
Khai bằng YAML/JSON không cần viết mã ứng dụng
Gọi HTTP, và API của Google Cloud có connector dựng sẵn
Truyền biến giữa các bước ${...}
Thử lại có backoff retry policy
Xử lý lỗi try/except
Rẽ nhánh và vòng lặp switch, for
Chờ sys.sleep, callback
Chạy tối đa 1 năm cho một lần thực thi
Chi phí — điểm khác biệt lớn nhất Nội dung
Workflows trả theo SỐ BƯỚC thực hiện — có mức miễn phí
Composer môi trường chạy 24/7 — chi phí nền đáng kể
Với một luồng nhỏ Workflows rẻ hơn rất nhiều
Với nhiều luồng, nhiều đội Composer chia đều chi phí nền
Nguyên tắc chọn mức nhẹ nhất còn đủ dùng
Vì sao "bất biến (idempotent)" được nhắc trong đề Lý do
Workflows tự THỬ LẠI khi lỗi
→ một bước có thể chạy nhiều lần
⚠ Nếu API không bất biến tạo bản ghi trùng, trừ tiền hai lần
Vì vậy đề nhấn mạnh API bất biến
Thực hành dùng idempotency key khi gọi API bên ngoài
Khi nào phải nâng lên Composer Dấu hiệu
Cần backfill cho quá khứ
Cần sensor chờ dữ liệu tới
DAG rất phức tạp, nhiều rẽ nhánh
Nhiều đội dùng chung, cần giao diện quản lý
Cần hàng trăm operator dựng sẵn
Nếu chỉ là chuỗi API Workflows là đủ

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Workflow chạy tới bước nào | console → Workflows → Executions | | Biến truyền giữa các bước có đúng không | xem chi tiết từng bước trong execution | | Có bị thử lại nhiều lần không | log của execution |

Và một lý do rất thực tế khiến Workflows thường là lựa chọn đúng cho luồng nhỏ: nó không có gì để bỏ quên. Không có môi trường nào chạy 24/7, không có phiên bản Airflow phải nâng cấp, không có worker phải giám sát — chỉ có một tệp YAML và hoá đơn tính theo số bước thật sự chạy.

Câu 213 Data Preparation and Ingestion

A development team needs a simple, serverless way to stream raw event data from a Pub/Sub (Publisher/Subscriber) topic directly into a BigQuery table. Their primary requirements are to minimize custom code and operational overhead. The solution must automatically handle schema evolution by adding new columns and route any messages that fail ingestion to a separate topic for later analysis.

Which approach best meets these requirements?

  1. A An external table pointing to files in Cloud Storage.
  2. B A managed Pub/Sub 'Write to BigQuery' subscription configured with a dead-letter topic and schema evolution.
  3. C A Cloud Function triggered by Pub/Sub that writes to BigQuery.
  4. D A custom Dataflow pipeline using the BigQuery Storage Write API.
Xem giải thích

Đáp án

B — Một BigQuery subscription được quản lý của Pub/Sub, cấu hình kèm dead-letter topic và bật tiến hoá lược đồ.

Vì sao đúng

Đề nêu bốn yêu cầu, và cách này đáp ứng cả bốn mà không cần viết mã: ghi thẳng vào BigQuery, giảm tối đa công vận hành, tự thêm cột mới khi lược đồ đổi, và định tuyến thông điệp lỗi sang topic riêng.

⚠ Điểm mấu chốt — Pub/Sub tự ghi, không cần dịch vụ trung gian:

Pub/Sub topic
        ↓
    BIGQUERY SUBSCRIPTION
        ↓
    Pub/Sub TỰ ghi vào bảng
    bằng Storage Write API
        ↓
    ⚠ KHÔNG có Dataflow
    ⚠ KHÔNG có Cloud Function
    ⚠ KHÔNG có mã nào phải bảo trì

⚠ Hai tuỳ chọn giải quyết hai yêu cầu còn lại:

1. TIẾN HOÁ LƯỢC ĐỒ
   --use-topic-schema
   → dùng lược đồ của topic
   → cột mới trong lược đồ được thêm
     vào bảng
   (kèm --drop-unknown-fields nếu cần
    bỏ qua trường lạ thay vì lỗi)

2. DEAD-LETTER TOPIC
   --dead-letter-topic=projects/.../topics/dlt
   --max-delivery-attempts=5
   → thông điệp thất bại chuyển sang DLT
   → phân tích được nguyên nhân

⚠ Vì sao dead-letter là BẮT BUỘC với subscription được quản lý:

Không có worker nào của bạn chạy
        ↓
    → KHÔNG có log ứng dụng để đọc
        ↓
    Thông điệp ghi thất bại
        ↓
    → nằm im trong subscription
    → backlog tăng, không có lỗi nào hiện ra
        ↓
    ⚠ DLT là cách DUY NHẤT bắt được
      thông điệp hỏng

Xem thêm câu #13090 (cùng lô): chính tình huống backlog tăng mà không có log → phải bật DLT. Và #13105 (cùng lô): nêu tiêu chí phân biệt giữa subscription được quản lý và subscriber tự viết. Ba câu tạo thành một bộ hoàn chỉnh về Pub/Sub → BigQuery.

Vì sao các phương án khác sai

  • D (pipeline Dataflow tự viết dùng Storage Write API) — đây là phương án gần nhất về mặt kỹ thuật và rất linh hoạt, nhưng nó đòi viết và vận hành một pipeline — trái yêu cầu "giảm tối đa mã tuỳ chỉnh và công vận hành".

  • C (Cloud Function được kích hoạt bởi Pub/Sub) — cũng phải viết mã, và kém hiệu quả ở thông lượng cao.

  • A (external table trỏ vào tệp trong Cloud Storage) — không phải cơ chế nạp luồng; dữ liệu vẫn phải được ghi ra tệp trước bằng cách nào đó.

Ghi nhớ

⚠ Bốn cách đưa Pub/Sub vào BigQuery — bảng phải thuộc: | Cách | Cần mã? | Biến đổi được? | |---|---|---| | BigQuery subscription | KHÔNG | không | | Dataflow | có | có — đầy đủ | | Cloud Run function | có | có, hạn chế | | Cloud Storage subscription → nạp sau | không | không | | Chọn subscription khi | chỉ nạp thô, không biến đổi |

Từ khoá nhận diện:

"nạp thẳng, ít mã, ít vận hành" → BigQuery subscription "cần biến đổi, che PII, tổng hợp cửa sổ" → Dataflow "lưu thô thành tệp" → Cloud Storage subscription "thông điệp lỗi để phân tích" → dead-letter topic "cột mới xuất hiện" → tiến hoá lược đồ

BigQuery subscription — các tuỳ chọn Tuỳ chọn
--bigquery-table bảng đích
--use-topic-schema dùng lược đồ của topic
--use-table-schema dùng lược đồ của bảng
--drop-unknown-fields bỏ trường lạ thay vì lỗi
--write-metadata ghi kèm thuộc tính thông điệp
--dead-letter-topic thông điệp hỏng đi đâu
Quyền service agent cần roles/bigquery.dataEditor
Lược đồ của TOPIC — nền của tiến hoá lược đồ Nội dung
Pub/Sub topic có thể gắn SCHEMA Avro hoặc Protocol Buffer
Thông điệp được kiểm tra khi publish
Lược đồ có PHIÊN BẢN thêm trường mới tạo revision
Subscription ánh xạ lược đồ topic sang cột bảng
Lợi ích hợp đồng dữ liệu rõ ràng giữa bên gửi và bên nhận
Ba chỉ số cần theo dõi Chỉ số
num_undelivered_messages backlog
oldest_unacked_message_age thông điệp cũ nhất
Số thông điệp vào DLT dấu hiệu lược đồ đổi hoặc dữ liệu hỏng
Cảnh báo đặt cho cả ba
Nếu backlog vượt thời gian giữ thông điệp bị MẤT
Khi nào phải chuyển sang Dataflow Dấu hiệu
Cần che PII trước khi vào kho
Cần tổng hợp theo cửa sổ
Cần làm giàu bằng nguồn khác
Cần biến đổi cấu trúc phức tạp
Nếu chỉ nạp thô subscription rẻ và đơn giản hơn nhiều

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Subscription cấu hình thế nào | gcloud pubsub subscriptions describe <sub> | | Có thông điệp hỏng không | subscription trên DLT | | Dữ liệu tới bảng chưa | SELECT MAX(<thời điểm>) |

Và một cấu hình nên coi là bắt buộc với mọi subscription được quản lý: dead-letter topic. Đây là kiến trúc không có worker nào của bạn chạy, nên nếu không có DLT, một thông điệp sai lược đồ sẽ chỉ biểu hiện thành một con số backlog tăng dần — không log, không lỗi, không manh mối nào về nguyên nhân.

Câu 214 Data Pipeline Orchestration

In a Dataform project, an engineer is creating a fct_daily_sales table. They need to configure two things:

1) ensure that the stg_orders and dim_customers tables are built first, and

2) add a data quality check to verify that the total_revenue column in the final table is never negative.

What Dataform features correspond to these two requirements, respectively?

  1. A 1) An assertion, and 2) a dependency
  2. B 1) A policy tag, and 2) a BigLake table
  3. C 1) A dependency (using the ref function), and 2) an assertion
  4. D 1) A scheduled query, and 2) a custom field
Xem giải thích

Đáp án

C — 1) Một DEPENDENCY (dùng hàm ref), và 2) một ASSERTION.

Vì sao đúng

Dataform có hai cơ chế riêng biệt cho hai nhu cầu này: ref() khai phụ thuộc để quyết định thứ tự dựng bảng, và assertions kiểm tra chất lượng dữ liệu.

⚠ Điểm mấu chốt — ref() vừa dựng SQL vừa khai phụ thuộc:

-- definitions/fct_daily_sales.sqlx
config {
  type: "table",
  assertions: {
    rowConditions: [
      "total_revenue >= 0"
    ]
  }
}

SELECT
  o.ngay,
  c.khu_vuc,
  SUM(o.tong_tien) AS total_revenue
FROM ${ref("stg_orders")} AS o
JOIN ${ref("dim_customers")} AS c
  ON c.khach_id = o.khach_id
GROUP BY 1, 2
        ↓
    ⚠ ref() làm HAI việc cùng lúc:
      1. thay bằng tên bảng đầy đủ trong SQL
      2. khai PHỤ THUỘC → Dataform dựng
         stg_orders và dim_customers TRƯỚC

⚠ Assertions — ba kiểu khai sẵn:

uniqueKey: ["order_id"]
    → không có khoá trùng

nonNull: ["order_id", "ngay"]
    → không có giá trị NULL

rowConditions: ["total_revenue >= 0"]
    → điều kiện tuỳ ý trên từng dòng
        ↓
    ⚠ Assertion THẤT BẠI → pipeline DỪNG
    → dữ liệu hỏng KHÔNG chảy tiếp

⚠ Vì sao ref() tốt hơn viết tên bảng cứng:

Viết cứng `du_an.stg_orders`
        ↓
    ⚠ Dataform KHÔNG BIẾT có phụ thuộc
    → có thể dựng fct_daily_sales TRƯỚC
      khi stg_orders sẵn sàng
    ⚠ Đổi môi trường (dev/prod) phải sửa mã
        ↓
    Dùng ${ref("stg_orders")}
        ↓
    → thứ tự tự đúng
    → tên bảng tự đổi theo môi trường

Xem thêm câu #13126 (cùng lô): mô tả điều gì xảy ra KHI assertion thất bại. Và #12991 (lô 135): khoá Dataform cho đội SQL-first cần Git và kiểm thử. Ba câu tạo thành một bộ về Dataform.

Vì sao các phương án khác sai

  • A (1: assertion, 2: dependency) — đây là phương án gần nhất vì dùng đúng hai thuật ngữ, nhưng gán ngược: phụ thuộc lo thứ tự, assertion lo chất lượng.

  • B (policy tag và BigLake table) — cả hai đều là cơ chế BẢO MẬT và quản trị, không liên quan tới thứ tự dựng bảng hay kiểm tra chất lượng.

  • D (scheduled query và custom field) — scheduled query là cách chạy SQL theo lịch (không quản lý phụ thuộc), custom field là tính năng của Looker.

Ghi nhớ

⚠ Các thành phần của Dataform — bảng phải thuộc: | Thành phần | Việc | |---|---| | ref("bang") | khai PHỤ THUỘC và thay tên bảng | | assertions | kiểm thử CHẤT LƯỢNG dữ liệu | | config.type | table, view, incremental, operations | | declaration | khai bảng NGUỒN bên ngoài | | dependencies | khai phụ thuộc không qua ref | | .sqlx | tệp định nghĩa: config + một câu SELECT |

Từ khoá nhận diện:

"bảng này phải dựng trước bảng kia" → ref() — dependency "kiểm tra dữ liệu không âm, không trùng" → assertion "chạy SQL theo lịch" → scheduled query — không quản phụ thuộc "phân loại cột nhạy cảm" → policy tag "trường tính toán trong Looker" → custom field

Ba kiểu assertion khai sẵn Kiểu
uniqueKey không trùng khoá
nonNull không có NULL
rowConditions điều kiện tuỳ ý trên từng dòng
Assertion tuỳ chỉnh tệp .sqlx với type: "assertion"
Nguyên tắc assertion là truy vấn trả về DÒNG VI PHẠM
Vì sao assertion đáng dùng ngay từ mô hình đầu tiên Lý do
Bắt lỗi dữ liệu NGAY trong pipeline không phải chờ người dùng phát hiện
Dừng trước khi dữ liệu hỏng lan xuống
Là TÀI LIỆU về giả định của bảng
Chạy tự động mỗi lần pipeline chạy
Chi phí rất nhỏ — chỉ là một truy vấn kiểm tra
Bảng gia tăng (incremental) — bổ sung đáng biết Nội dung
type: "incremental" chỉ xử lý dữ liệu MỚI
when(incremental(), ...) điều kiện lọc phần mới
uniqueKey trong config dùng cho MERGE
Lợi ích giảm mạnh chi phí truy vấn
Kết hợp phân vùng theo ngày
Dataform ↔ dbt Nội dung
Rất giống nhau ref(), test, Git, môi trường
Dataform tích hợp sẵn trong Google Cloud, MIỄN PHÍ
dbt hệ sinh thái lớn hơn, đa nền tảng
Chi phí cả hai chỉ tính tiền truy vấn BigQuery
Chọn Dataform khi chỉ dùng BigQuery

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Đồ thị phụ thuộc thế nào | compile trong giao diện Dataform | | Assertion có chạy không | kết quả workflow execution | | Bảng nào thiếu assertion | rà soát các tệp .sqlx |

Và một thói quen đáng thiết lập ngay từ mô hình đầu tiên: mọi bảng đều phải có ít nhất uniqueKey và nonNull. Hai dòng khai báo đó bắt được phần lớn lỗi dữ liệu thực tế — trùng khoá do nạp lại, và trường bắt buộc bị thiếu khi nguồn đổi — và chúng bắt được trước khi báo cáo hiển thị con số sai.

Câu 215 Data Pipeline Orchestration

A developer needs to trigger a Cloud Function every time a new message is published to a specific Pub/Sub topic. The company has a policy to use a centralized event-routing service for all such integrations.

Which service should the developer use to create a trigger that subscribes to the Pub/Sub topic and invokes the Cloud Function?

  1. A Cloud Scheduler
  2. B Cloud Logging
  3. C Cloud Composer
  4. D Eventarc
Xem giải thích

Đáp án

D — Eventarc.

Vì sao đúng

Đề nêu hai điều: cần trigger đăng ký một Pub/Sub topic và gọi Cloud Function, và công ty có chính sách dùng MỘT dịch vụ ĐỊNH TUYẾN SỰ KIỆN TẬP TRUNG cho mọi tích hợp kiểu này. Eventarc chính là dịch vụ đó.

⚠ Điểm mấu chốt — "định tuyến sự kiện tập trung" là từ khoá:

Eventarc
        ↓
    Lớp ĐỊNH TUYẾN SỰ KIỆN thống nhất
    của Google Cloud
        ↓
    - hơn 130 nguồn sự kiện
    - chuẩn CloudEvents
    - đích: Cloud Run, Cloud Run functions,
      Workflows, GKE
        ↓
    ⚠ Chính sách công ty đòi
      "một dịch vụ tập trung"
    → Eventarc đúng vai trò đó

⚠ Tạo trigger cho nguồn Pub/Sub:

gcloud eventarc triggers create trigger-pubsub \
  --destination-run-service=ham-xu-ly \
  --destination-run-region=asia-southeast1 \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --transport-topic=projects/DU-AN/topics/su-kien \
  --service-account=sa@du-an.iam.gserviceaccount.com

⚠ Vì sao "định tuyến tập trung" lại đáng giá:

Không có lớp tập trung
        ↓
    Mỗi tích hợp một kiểu:
      - hàm này dùng trigger Pub/Sub trực tiếp
      - hàm kia dùng trigger GCS
      - hàm khác tự viết subscriber
        ↓
    ⚠ Không có chỗ nào nhìn thấy
      TOÀN BỘ luồng sự kiện
    ⚠ Khó kiểm toán, khó chuẩn hoá
        ↓
    Eventarc
        ↓
    → một nơi khai và xem mọi trigger
    → cùng chuẩn CloudEvents
    → cùng cách xác thực

Xem thêm câu #13120 (cùng lô): cùng khoá Eventarc, nhưng nguồn là Cloud Storage và đích là Cloud Run service. Hai câu hoàn toàn nhất quán — Eventarc là cơ chế chung cho mọi nguồn và đích.

Vì sao các phương án khác sai

  • C (Cloud Composer) — đây là phương án gần nhất trong nhóm "tự động hoá", nhưng nó là bộ ĐIỀU PHỐI luồng nhiều bước, không phải cơ chế định tuyến sự kiện; và nó đòi một môi trường thường trực.

  • A (Cloud Scheduler) — kích hoạt theo LỊCH, không phản ứng theo sự kiện.

  • B (Cloud Logging) — lưu và tra cứu log; nó có thể sinh ra sự kiện audit log, nhưng không phải dịch vụ định tuyến.

Ghi nhớ

⚠ Bốn cơ chế kích hoạt — bảng phải thuộc: | Kích hoạt theo | Công cụ | |---|---| | SỰ KIỆN của dịch vụ GCP | Eventarc | | LỊCH (cron) | Cloud Scheduler | | Thông điệp hàng đợi | Pub/Sub (trigger trực tiếp) | | Tác vụ có kiểm soát tốc độ | Cloud Tasks | | Luồng nhiều bước | Cloud Composer / Workflows |

Từ khoá nhận diện:

"định tuyến sự kiện tập trung" → Eventarc "khi tệp được tải lên" → Eventarc (nguồn GCS) "đúng giờ mỗi ngày" → Cloud Scheduler "nhiều bước có phụ thuộc" → Composer / Workflows "lưu và tra cứu log" → Cloud Logging

Eventarc — các nguồn sự kiện Nguồn
Cloud Storage tệp được tạo, xoá, cập nhật
Pub/Sub thông điệp được publish
Firestore tài liệu thay đổi
Cloud Audit Logs sự kiện từ hơn 130 dịch vụ
BigQuery job hoàn tất (qua audit log)
Nguồn bên thứ ba qua Eventarc Advanced
Eventarc — các đích Đích
Cloud Run service phổ biến nhất
Cloud Run functions
Workflows cho luồng nhiều bước
GKE service
Chuẩn CloudEvents — định dạng thống nhất
Xác thực OIDC token
Trigger trực tiếp ↔ Eventarc Nội dung
Trigger trực tiếp (--trigger-topic) nhanh, đơn giản cho một hàm
Eventarc thống nhất, kiểm toán được, nhiều nguồn
⚠ Thực tế Cloud Run functions gen2 dùng Eventarc bên dưới
Chọn Eventarc khi có chính sách chuẩn hoá như đề này
Chọn trực tiếp khi một tích hợp đơn lẻ, đơn giản
Quyền cần cho Eventarc Quyền
Service account của trigger roles/run.invoker trên đích
roles/eventarc.eventReceiver nhận sự kiện
Service agent quyền publish/subscribe Pub/Sub
Bật API Eventarc, Pub/Sub, Cloud Run
Thiếu quyền trigger tạo được nhưng sự kiện không tới

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Có những trigger nào | gcloud eventarc triggers list | | Sự kiện có tới không | log của dịch vụ đích | | Vì sao không tới | kiểm tra roles/run.invoker |

Và một lợi ích của việc chuẩn hoá qua Eventarc mà chỉ thấy rõ khi hệ thống đã lớn: một chỗ duy nhất để trả lời câu hỏi "sự kiện này chảy đi đâu". Với hàng chục tích hợp mỗi cái một kiểu, việc lần ra ai đang lắng nghe topic nào là một dự án khảo cổ — còn với Eventarc, đó là một lệnh triggers list.

Câu 216 Data Pipeline Orchestration

An analytics engineer has a Dataform pipeline where a final fct_orders table depends on a stg_orders table. The stg_orders table has a data quality assertion to ensure all order_id values are unique. During a scheduled run, duplicate order_ids in the source data cause this assertion to fail.

What is the resulting behavior of the Dataform pipeline?

  1. A The pipeline will ignore the failed assertion, run completely, and load the bad data into the fct_orders table.
  2. B The pipeline run will fail at the stg_orders step, and Dataform will block the execution of the downstream fct_orders table.
  3. C The pipeline will send a notification but will continue to run all steps to completion.
  4. D The pipeline will skip creating the stg_orders table but will attempt to build the fct_orders table using stale data.
Xem giải thích

Đáp án

B — Lần chạy sẽ THẤT BẠI ở bước stg_orders, và Dataform sẽ CHẶN việc thực thi bảng fct_orders phía sau.

Vì sao đúng

Assertion trong Dataform là cổng chất lượng: khi nó thất bại, pipeline dừng lại tại đó và các bảng phụ thuộc không được dựng — để dữ liệu hỏng không lan xuống.

⚠ Điểm mấu chốt — assertion chặn luồng phía sau:

stg_orders được dựng
        ↓
    Assertion uniqueKey: ["order_id"] chạy
        ↓
    Phát hiện order_id trùng
        ↓
    ⚠ ASSERTION THẤT BẠI
        ↓
    → bước stg_orders báo FAILED
    → fct_orders (phụ thuộc qua ref)
      KHÔNG được thực thi
        ↓
    ⚠ Bảng fct_orders giữ nguyên
      dữ liệu của lần chạy TRƯỚC

⚠ Vì sao "chặn" là hành vi ĐÚNG:

Nếu vẫn chạy tiếp
        ↓
    → dữ liệu TRÙNG chảy vào fct_orders
    → doanh thu bị TÍNH HAI LẦN
    → báo cáo sai mà KHÔNG có tín hiệu nào
        ↓
    ⚠ Bảng báo cáo hiển thị số cũ
      còn TỐT HƠN hiển thị số sai
        ↓
    Nguyên tắc: THÀ DỪNG CÒN HƠN CHẠY SAI

⚠ Quy trình xử lý khi assertion thất bại:

1. Xem bảng KẾT QUẢ ASSERTION
     → Dataform lưu các DÒNG VI PHẠM
2. Tìm nguyên nhân ở nguồn
     → nạp lại hai lần? nguồn có trùng thật?
3. Sửa:
     - thêm bước loại trùng trong stg_orders
     - hoặc sửa quy trình nạp
4. Chạy lại pipeline
        ↓
    ⚠ Assertion cũng là công cụ CHẨN ĐOÁN,
      không chỉ là cổng chặn

Xem thêm câu #13124 (cùng lô): khai ref() và assertions. Câu này mô tả điều gì xảy ra khi assertion thất bại. Hai câu bổ sung nhau hoàn hảo. Và #13052 (lô 136): cùng nguyên tắc dừng và cảnh báo khi một bước hỏng.

Vì sao các phương án khác sai

  • C (gửi thông báo nhưng vẫn chạy hết mọi bước) — đây là phương án gần nhất vì thông báo là điều nên có, nhưng Dataform KHÔNG chạy tiếp các bảng phụ thuộc; nếu chạy tiếp thì assertion mất hết ý nghĩa.

  • A (bỏ qua assertion và nạp dữ liệu xấu) — ngược hoàn toàn với mục đích của assertion.

  • D (bỏ qua stg_orders nhưng vẫn dựng fct_orders bằng dữ liệu cũ) — không phải hành vi của Dataform; bảng phụ thuộc bị chặn, không phải được dựng bằng dữ liệu cũ.

Ghi nhớ

⚠ Hành vi của Dataform khi assertion thất bại — bảng phải thuộc: | Điều xảy ra | Nội dung | |---|---| | Bước đó báo FAILED | | | Các bảng PHỤ THUỘC bị CHẶN | không thực thi | | Bảng phía sau giữ dữ liệu lần chạy TRƯỚC | | | Dòng vi phạm được lưu lại | bảng kết quả assertion | | Cảnh báo | nếu đã cấu hình thông báo | | Nguyên tắc | thà dừng còn hơn chạy sai |

Từ khoá nhận diện:

"assertion thất bại" → dừng bước đó và chặn bước sau "vẫn chạy tiếp" → luôn là phương án SAI "bỏ qua và nạp dữ liệu xấu" → sai mục đích của assertion "chỉ gửi thông báo" → chưa đủ "dữ liệu hỏng lan xuống" → chính điều assertion ngăn chặn

Ba kiểu assertion — nhắc lại Kiểu
uniqueKey không trùng khoá — chính là trường hợp trong đề
nonNull không có NULL
rowConditions điều kiện tuỳ ý
Assertion tuỳ chỉnh tệp .sqlx với type: "assertion"
Bản chất truy vấn trả về DÒNG VI PHẠM
Vì sao dữ liệu bị trùng ngay từ đầu Nguyên nhân
Nạp lại cùng một tệp hai lần thiếu kiểm soát
Pub/Sub at-least-once thông điệp lặp
Nguồn thật sự có bản ghi trùng
JOIN sai ở bước trước nhân bản dòng
Cách chữa gốc xử lý bất biến + MERGE theo khoá
Loại trùng trong bước staging Cách
ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY cap_nhat DESC) giữ bản mới nhất
QUALIFY rn = 1 lọc gọn
SELECT DISTINCT nếu trùng hoàn toàn
MERGE khi nạp cập nhật thay vì chèn
Sau khi sửa assertion sẽ tự qua ở lần chạy sau
Cấu hình cảnh báo cho Dataform Cách
Workflow configuration lịch chạy
Thông báo qua email hoặc Pub/Sub khi lần chạy thất bại
Kết hợp Cloud Monitoring log-based metric
Xem kết quả assertion trong giao diện Dataform
Nên có cảnh báo cho MỌI pipeline sản xuất
Khi nào assertion nên CHỈ cảnh báo Trường hợp
Kiểm tra "mềm" — dấu hiệu bất thường, không phải lỗi
Cách làm tách thành assertion riêng, không gắn vào bảng
Hoặc dùng tags để chạy nhóm assertion riêng
Nhưng kiểm tra khoá trùng nên luôn là cổng CỨNG
Nguyên tắc chặn cứng thứ làm sai số liệu; cảnh báo thứ chỉ đáng ngờ

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Assertion thất bại ở dòng nào | bảng kết quả assertion trong Dataform | | Bảng phía sau có bị chặn không | xem trạng thái trong workflow execution | | Nguồn có trùng thật không | GROUP BY order_id HAVING COUNT(*) > 1 |

Và một giá trị của assertion mà người ta thường chỉ nhận ra sau lần thất bại đầu tiên: nó không chỉ chặn, nó còn chỉ ra chính xác những dòng nào sai. Thay vì một báo cáo lệch số mà không ai biết bắt đầu tìm từ đâu, bạn có ngay danh sách order_id bị trùng — và đó thường là toàn bộ manh mối cần thiết để lần ra nguyên nhân ở hệ thống nguồn.

Câu 217 Data Analysis and Presentation

A data practitioner is designing a data platform on Google Cloud. They must choose the most suitable primary storage service for three distinct types of data based on their structure and intended use.

Instructions: Match each data type with the most appropriate Google Cloud service.

Data Type / Use Case

  1. Unstructured Data: Raw media files like images and videos to be stored in a data lake.

  2. Structured Data: A petabyte-scale dataset of historical sales transactions with a fixed schema, used for company-wide analytics.

  3. Semi-structured Data: High-throughput, low-latency time-series data from millions of IoT devices, queried by a row key.

Google Cloud Service

  • A. BigQuery

  • B. Cloud Storage

  • C. Bigtable

Which option correctly matches the data types to the services?

  1. A

    1-B, 2-C, 3-A

  2. B

    1-B, 2-A, 3-C

  3. C

    1-A, 2-B, 3-C

  4. D

    1-C, 2-A, 3-B

Xem giải thích

Đáp án

B — 1-B, 2-A, 3-C: Phi cấu trúc → Cloud Storage; Có cấu trúc quy mô petabyte → BigQuery; Bán cấu trúc chuỗi thời gian IoT → Bigtable.

Vì sao đúng

Ba loại dữ liệu trong đề là ba đại diện kinh điển, và mỗi loại có một dịch vụ chuyên trách.

⚠ Điểm mấu chốt — ánh xạ từng loại:

1) PHI CẤU TRÚC
   "tệp media thô: ảnh, video, cho data lake"
        ↓
    → CLOUD STORAGE (B)
    → kho đối tượng, rẻ, không giới hạn

2) CÓ CẤU TRÚC
   "petabyte giao dịch bán hàng lịch sử,
    lược đồ cố định, phân tích toàn công ty"
        ↓
    → BIGQUERY (A)
    → kho phân tích, lưu theo cột

3) BÁN CẤU TRÚC
   "chuỗi thời gian IoT, thông lượng cao,
    độ trễ thấp, truy vấn theo ROW KEY"
        ↓
    → BIGTABLE (C)
    → NoSQL wide-column

⚠ Từ khoá quyết định của mỗi vế:

"media files, data lake"
    → kho ĐỐI TƯỢNG, không phải CSDL

"petabyte, lược đồ cố định, PHÂN TÍCH"
    → kho PHÂN TÍCH, không phải giao dịch

"ROW KEY, thông lượng cao, độ trễ thấp"
    → ⚠ "row key" là dấu hiệu RẤT RÕ
      của Bigtable

⚠ Vì sao Bigtable chứ không phải BigQuery cho IoT:

BigQuery
    → tối ưu cho QUÉT LỚN và tổng hợp
    → ⚠ không hợp đọc/ghi TỪNG bản ghi
      độ trễ mili giây

Bigtable
    → đọc/ghi theo ROW KEY rất nhanh
    → ghi hàng triệu điểm/giây
        ↓
    Mẫu thường dùng:
      Bigtable cho VẬN HÀNH
      + xuất sang BigQuery cho PHÂN TÍCH SÂU

Xem thêm câu #13057 (lô 136): ánh xạ giao dịch / tệp / phân tích vào Cloud SQL, Cloud Storage, BigQuery. #13071 (lô 136): Cloud Storage cho media. #13084 (cùng lô): Bigtable cho IoT. Bốn câu tạo thành bảng chọn kho đầy đủ — hoàn toàn nhất quán.

Vì sao các phương án khác sai

  • A (1-B, 2-C, 3-A) — đây là phương án gần nhất vì vế đầu đúng (Cloud Storage cho media), nhưng nó đảo BigQuery và Bigtable ở hai vế sau.

  • C (1-A, 2-B, 3-C) — đưa media vào BigQuery và dữ liệu phân tích vào Cloud Storage — sai cả hai vế đầu.

  • D (1-C, 2-A, 3-B) — đưa media vào Bigtable và IoT vào Cloud Storage — sai vế đầu và vế cuối.

Ghi nhớ

⚠ Bảng chọn kho theo LOẠI DỮ LIỆU — bảng phải thuộc: | Loại dữ liệu | Dịch vụ | |---|---| | Phi cấu trúc: ảnh, video, PDF, log thô | Cloud Storage | | Có cấu trúc, PHÂN TÍCH quy mô lớn | BigQuery | | Có cấu trúc, GIAO DỊCH | Cloud SQL / AlloyDB / Spanner | | Bán cấu trúc, chuỗi thời gian, ghi lớn | Bigtable | | Tài liệu, thời gian thực, di động | Firestore | | Bộ nhớ đệm | Memorystore |

Từ khoá nhận diện:

"ảnh, video, media, data lake" → Cloud Storage "petabyte, phân tích, lược đồ cố định" → BigQuery "row key, IoT, chuỗi thời gian, thông lượng cao" → Bigtable "giao dịch, nhất quán" → Cloud SQL "đồng bộ thời gian thực tới máy khách" → Firestore

Ba từ khoá nhận diện Bigtable Từ khoá
"row key" dấu hiệu rõ nhất
"wide-column" mô hình dữ liệu
"hàng triệu ghi mỗi giây" quy mô
"độ trễ một chữ số mili giây"
"chuỗi thời gian, IoT, tài chính thời gian thực" trường hợp dùng
Bigtable ↔ BigQuery — bổ sung nhau Nội dung
Bigtable VẬN HÀNH — đọc ghi từng bản ghi
BigQuery PHÂN TÍCH — quét và tổng hợp
Mẫu Bigtable phục vụ ứng dụng, xuất sang BigQuery để phân tích
Công cụ nối Dataflow, hoặc BigQuery external table trên Bigtable
Sai lầm dùng một cái cho cả hai việc
Thiết kế row key cho Bigtable Nguyên tắc
Tránh giá trị TĂNG DẦN ĐỀU ở đầu timestamp thuần → hotspot
Đặt định danh phân tán lên trước <sensor_id>#<...>
Timestamp ĐẢO NGƯỢC đọc dữ liệu mới nhất nhanh
Không có chỉ mục phụ mọi truy vấn qua row key
⚠ Quyết định này gần như không sửa được về sau
Cloud Storage cho data lake Nội dung
Kho đối tượng, không giới hạn dung lượng
Bốn lớp lưu trữ Standard, Nearline, Coldline, Archive
Lifecycle rule tự chuyển lớp và dọn dẹp
BigLake table truy vấn tại chỗ bằng SQL, có bảo mật
Object table truy vấn siêu dữ liệu tệp phi cấu trúc
Kết hợp Dataplex để quản trị

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bigtable có hotspot không | Key Visualizer | | BigQuery có bị dùng cho tra cứu điểm không | xem truy vấn WHERE id = ... chạy liên tục | | Chi phí chia theo dịch vụ | billing export, nhóm theo SKU |

Và một mẹo làm bài rất hiệu quả với các câu hỏi ghép cặp kiểu này: tìm vế DỄ NHẤT trước rồi loại trừ. "Media files, data lake" gần như chắc chắn là Cloud Storage — chỉ riêng điều đó đã loại được hai trong bốn phương án, và câu hỏi thu lại thành một lựa chọn giữa hai khả năng.

Câu 218 Data Analysis and Presentation

A data analyst is tasked with adding a new field—a measure for average_order_value—to their company's existing Looker data model. To locate the correct file and add the code, the analyst must navigate the LookML project structure from the highest level down to the specific file where fields are defined.

Which option lists the LookML components in the correct hierarchical order, from the broadest container to the most specific element?

  1. A

    Project -> Explore -> Model -> View -> Measure

  2. B

    Project -> Model -> Explore -> View -> Measure

  3. C

    Project -> Model -> View -> Explore -> Measure

  4. D

    Explore -> View -> Measure -> Model -> Project

Xem giải thích

Đáp án

B — Project → Model → Explore → View → Measure.

Vì sao đúng

Đây là thứ tự phân cấp thật sự của LookML, từ vùng chứa rộng nhất tới phần tử cụ thể nhất — và cũng là đường đi khi bạn tìm chỗ để thêm một measure.

⚠ Điểm mấu chốt — năm cấp từ ngoài vào trong:

PROJECT
    → toàn bộ kho mã LookML (một repo Git)
        ↓
    MODEL (.model.lkml)
        → khai CONNECTION tới CSDL
        → gom các EXPLORE
        ↓
        EXPLORE
            → điểm vào cho người dùng
            → khai JOIN giữa các view
            ↓
            VIEW (.view.lkml)
                → ánh xạ MỘT BẢNG
                ↓
                DIMENSION / MEASURE
                    → trường cụ thể

⚠ Vì sao measure nằm trong VIEW, không nằm trong explore:

measure: average_order_value {
  type: average
  sql: ${TABLE}.amount ;;
}
        ↓
    ⚠ Trường thuộc về BẢNG nào thì khai
      trong VIEW của bảng đó
        ↓
    Explore chỉ TẬP HỢP các view lại
    và khai cách chúng nối với nhau
        ↓
    → muốn thêm measure về đơn hàng
      → mở orders.view.lkml

⚠ Điều gây nhầm — explore VIẾT trong tệp model:

Tệp cua_hang.model.lkml chứa:
    connection: "bigquery_..."
    include: "/views/*.view.lkml"

    explore: orders {
      join: users { ... }
    }
        ↓
    ⚠ Explore VIẾT bên trong tệp model
    ⚠ Nhưng về PHÂN CẤP, explore
      nằm DƯỚI model và TRÊN view
        ↓
    → đây là nguồn nhầm lẫn phổ biến nhất

Xem thêm câu #13026 (lô 135): hỏi VAI TRÒ của ba thành phần model, view, explore. Câu này hỏi THỨ TỰ PHÂN CẤP. Hai câu bổ sung nhau hoàn hảo — cùng một kiến thức nhìn từ hai góc.

Vì sao các phương án khác sai

  • C (Project → Model → View → Explore → Measure) — đây là phương án gần nhất và ba cấp đầu đúng, nhưng nó đảo View và Explore: explore tập hợp các view, nên nằm trên view.

  • A (Project → Explore → Model → View → Measure) — đảo Model và Explore: model là vùng chứa của explore.

  • D (Explore → View → Measure → Model → Project) — đảo ngược hoàn toàn.

Ghi nhớ

⚠ Phân cấp LookML — bảng phải thuộc: | Cấp | Thành phần | Vai trò | |---|---|---| | 1 | Project | toàn bộ kho mã LookML | | 2 | Model | connection + tập các explore | | 3 | Explore | điểm vào, khai JOIN | | 4 | View | ánh xạ MỘT bảng | | 5 | Dimension / Measure | trường cụ thể | | Bẫy | explore VIẾT trong tệp model nhưng nằm DƯỚI model về phân cấp |

Từ khoá nhận diện:

"thêm một measure" → mở VIEW của bảng đó "khai JOIN" → explore "kết nối CSDL" → model "toàn bộ kho mã" → project "điểm vào cho người dùng" → explore

Các loại tệp trong một project LookML Tệp
*.model.lkml connection, include, explore
*.view.lkml dimension, measure, sql_table_name
*.dashboard.lookml dashboard khai bằng mã
*.explore.lkml explore tách riêng (dự án lớn)
manifest.lkml cấu hình project, hằng số
.gitignore, README như mọi kho mã
Các thành phần trong một VIEW Thành phần
sql_table_name bảng thật trong CSDL
dimension thuộc tính để cắt lớp
dimension_group nhóm chiều thời gian — sinh ngày, tuần, tháng
measure chỉ số tổng hợp
derived_table bảng dẫn xuất từ SQL
primary_key: yes rất quan trọng cho symmetric aggregates
Các thành phần trong một EXPLORE Thành phần
join nối các view
sql_on điều kiện nối
relationship many_to_one, one_to_many...
access_filter lọc dòng theo user attribute
always_filter, sql_always_where lọc mặc định
fields giới hạn trường được đưa vào
Vì sao primary_key quan trọng Lý do
Looker dùng nó cho symmetric aggregates
→ tính đúng measure khi có fan-out từ join
Thiếu primary key tổng bị NHÂN LÊN khi join one-to-many
Triệu chứng doanh thu cao hơn thực tế
Nên khai primary_key: yes cho mọi view

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Measure nằm ở tệp nào | tìm tên trường trong kho LookML | | Explore dùng những view nào | đọc tệp model | | SQL sinh ra thế nào | tab SQL trong Explore |

Và một chi tiết trong cấu trúc LookML mà người mới rất hay bỏ qua, nhưng lại gây sai số liệu nhiều nhất: khai primary_key: yes trong mỗi view. Không có nó, Looker không dùng được cơ chế symmetric aggregates, và mọi measure trên bảng bị join one-to-many sẽ bị cộng lặp — truy vấn vẫn chạy, biểu đồ vẫn đẹp, chỉ có con số là sai.

Câu 219 Data Analysis and Presentation

An analyst needs to build a new dashboard in Looker to visualize sales performance. They have already explored the data and saved several visualizations as "Looks."

What is the next step they should take within the Looker UI to assemble these Looks into a shareable dashboard?

  1. A Add a new project to the model.
  2. B Go to the "Dashboards" section and add a new dashboard, then add tiles from their Looks.
  3. C Use the SQL Runner to write a query that combines the Looks.
  4. D Create a new view file in LookML.
Xem giải thích

Đáp án

B — Vào mục "Dashboards", tạo một dashboard mới, rồi thêm các tile từ những Look đã lưu.

Vì sao đúng

Trong Looker, Look là một truy vấn đã lưu kèm cách hiển thị; dashboard là nơi gom nhiều Look thành một trang để chia sẻ. Quy trình đúng là tạo dashboard rồi thêm tile.

⚠ Điểm mấu chốt — Look và dashboard là hai khái niệm khác nhau:

LOOK
    → MỘT truy vấn đã lưu + một biểu đồ
    → xem riêng lẻ được
    → có thể dùng lại ở nhiều dashboard

DASHBOARD
    → TẬP HỢP nhiều TILE
    → mỗi tile là một biểu đồ
    → có BỘ LỌC dùng chung
    → chia sẻ như một trang duy nhất

⚠ Hai cách thêm tile vào dashboard:

CÁCH 1 — từ Look đã lưu
    Dashboard → Add tile → From a Look
        ↓
    ⚠ Tile LIÊN KẾT tới Look
    → sửa Look thì tile đổi theo

CÁCH 2 — tạo tile mới ngay trên dashboard
    Dashboard → Add tile → New tile
        ↓
    → truy vấn thuộc về dashboard,
      không phải Look riêng
        ↓
    Đề nói "đã lưu các Look" → cách 1

⚠ Sau khi có dashboard — các bước tiếp:

- Thêm DASHBOARD FILTER
  → cho người xem tự lọc
- Sắp xếp bố cục các tile
- Đặt dashboard vào FOLDER
- Cấp quyền View cho GROUP
- Đặt scheduled delivery nếu cần
        ↓
    ⚠ Quyền cấp ở FOLDER, không ở
      từng dashboard

Xem thêm câu #13112 (cùng lô): thêm dashboard filter để người dùng tự lọc. Và #13013 (lô 135): cấp quyền qua folder + group. Ba câu mô tả ba bước liên tiếp của cùng một quy trình.

Vì sao các phương án khác sai

  • D (tạo tệp view mới trong LookML) — đây là phương án gần nhất trong các thao tác Looker, nhưng đó là việc của developer ở tầng MÔ HÌNH; dựng dashboard là thao tác ở tầng nội dung, không cần đụng LookML.

  • C (dùng SQL Runner để viết truy vấn gộp các Look) — SQL Runner dùng để chạy SQL thô trực tiếp lên CSDL; nó không gộp Look thành dashboard.

  • A (thêm project mới vào model) — thao tác ở tầng dự án LookML, hoàn toàn không liên quan.

Ghi nhớ

⚠ Các khái niệm nội dung trong Looker — bảng phải thuộc: | Khái niệm | Nội dung | |---|---| | Explore | giao diện KHÁM PHÁ dữ liệu | | Look | MỘT truy vấn đã lưu + biểu đồ | | Dashboard | TẬP HỢP tile, có bộ lọc chung | | Tile | một ô trên dashboard | | Folder | nơi chứa nội dung và CẤP QUYỀN | | Board | trang tổng hợp liên kết tới nội dung |

Từ khoá nhận diện:

"gom các Look thành một trang" → dashboard "một truy vấn đã lưu" → Look "cho người dùng tự lọc" → dashboard filter "cấp quyền cho nhóm" → folder permission "sửa mô hình dữ liệu" → LookML — tầng khác

Tile liên kết ↔ tile độc lập Nội dung
Tile từ Look liên kết — sửa Look thì tile đổi
Tile tạo mới trên dashboard độc lập — chỉ thuộc dashboard đó
Ưu điểm liên kết sửa một chỗ, nhiều dashboard cập nhật
Nhược điểm sửa Look có thể phá dashboard khác
Lời khuyên dùng tile liên kết cho biểu đồ dùng chung
Thiết kế dashboard cho tốt Thói quen
Chỉ số quan trọng nhất ở TRÊN CÙNG
Không quá nhiều tile mỗi tile là một truy vấn
Dashboard filter thay vì nhiều bản sao
Đặt tên rõ ràng cho từng tile
Ghi chú giải thích chỉ số text tile
Kiểm tra trên màn hình nhỏ
Hiệu năng dashboard Cách
Bảng tổng hợp thay vì bảng giao dịch
Aggregate awareness trong LookML Looker tự dùng bảng gộp
Datagroup và cache kiểm soát khi nào truy vấn lại
Required filter tránh quét toàn bộ
Giảm số tile mỗi tile là một truy vấn riêng
Chia sẻ dashboard Cách
Đặt vào FOLDER, cấp quyền cho GROUP
Scheduled delivery gửi bản tĩnh theo lịch
Signed embed nhúng cho người ngoài
Link kèm bộ lọc chia sẻ ngữ cảnh cụ thể
⚠ URL không phải cơ chế bảo mật

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Tile lấy dữ liệu từ đâu | mở tile → Explore from here | | Dashboard tốn bao nhiêu | INFORMATION_SCHEMA.JOBS phía BigQuery | | Ai xem được | quyền của FOLDER chứa dashboard |

Và một quyết định nên cân nhắc khi thêm tile: dùng Look có sẵn hay tạo tile mới. Tile liên kết tới Look giúp sửa một chỗ và mọi nơi cập nhật, nhưng cũng có nghĩa là một thay đổi nhỏ trong Look sẽ ảnh hưởng tới mọi dashboard đang dùng nó — nên với biểu đồ chỉ phục vụ một dashboard, tạo tile mới thường an toàn hơn.

Câu 220 Data Management

A company runs its primary database on a Cloud SQL for MySQL instance in the us-central1 region. To implement a disaster recovery plan, they need to ensure they can restore operations in a different geographical region (us-east1) in case of a complete failure of us-central1.

Which Cloud SQL feature is specifically designed for this purpose?

  1. A High availability (HA) configuration
  2. B Automated backups
  3. C Point-in-time recovery
  4. D Cross-region read replicas
Xem giải thích

Đáp án

D — Cross-region read replica (bản sao đọc ở Region khác).

Vì sao đúng

Yêu cầu là khôi phục hoạt động ở một Region ĐỊA LÝ KHÁC khi us-central1 hỏng hoàn toàn. Chỉ bản sao nằm ở Region khác mới đáp ứng được.

⚠ Điểm mấu chốt — mỗi cơ chế chống một loại sự cố:

CẤU HÌNH HA (regional)
        ↓
    Máy dự phòng ở ZONE KHÁC,
    CÙNG Region us-central1
        ↓
    ⚠ Cả Region chết → KHÔNG cứu được

CROSS-REGION READ REPLICA        ← đề này
        ↓
    Bản sao ở us-east1
        ↓
    us-central1 chết
        ↓
    → THĂNG CẤP replica thành
      instance độc lập, ghi được
    → trỏ ứng dụng sang

⚠ Quy trình khi Region chính gặp sự cố:

gcloud sql instances promote-replica ten-replica
        ↓
    Replica trở thành instance ĐỘC LẬP
        ↓
    ⚠ Thao tác MỘT CHIỀU — không quay lại
      làm replica được
    ⚠ Nhân bản là BẤT ĐỒNG BỘ
      → có thể MẤT vài giao dịch cuối
        ↓
    Sau đó: bật HA, bật sao lưu,
    tạo replica mới cho instance mới

⚠ Hai con số phải thống nhất với bên nghiệp vụ:

RPO — chấp nhận MẤT bao nhiêu dữ liệu
    → với replica bất đồng bộ: vài giây

RTO — chấp nhận NGỪNG bao lâu
    → thăng cấp replica: vài phút
        ↓
    Cần RPO = 0 trên nhiều Region
      → phải dùng CLOUD SPANNER,
        không phải Cloud SQL

Xem thêm câu #12955 (lô 134): cùng tình huống, cùng khoá cross-region read replica. Hai câu hoàn toàn nhất quán. Và #12932 (lô 134): khoá PITR vì ở đó chống lỗi con người, không phải sự cố Region.

Vì sao các phương án khác sai

  • A (cấu hình HA) — đây là phương án gần nhất và bắt buộc phải có cho hệ thống quan trọng, nhưng nó đặt máy dự phòng ở ZONE khác trong CÙNG Region; mất cả us-central1 là mất cả hai.

  • B (sao lưu tự động) — bắt buộc phải có, nhưng khôi phục từ sao lưu mất hàng giờ, và bản sao lưu mặc định nằm cùng khu vực.

  • C (point-in-time recovery) — chống lỗi con người (xoá nhầm), không phải cơ chế chịu lỗi Region.

Ghi nhớ

⚠ Bốn cơ chế của Cloud SQL và loại sự cố chúng chống — bảng phải thuộc: | Cơ chế | Chống | |---|---| | Sao lưu tự động + PITR | lỗi con người, dữ liệu hỏng | | Cấu hình HA (regional) | hỏng một ZONE | | Read replica cùng Region | quá tải đọc | | Cross-region read replica | sự cố CẢ REGION | | Nhớ | bốn cơ chế, bốn mục đích — không thay thế nhau |

Từ khoá nhận diện:

"khôi phục ở Region địa lý khác" → cross-region read replica "chịu được hỏng một zone" → cấu hình HA regional "xoá nhầm dữ liệu" → PITR "giảm tải đọc" → read replica "RPO = 0 đa Region" → Cloud Spanner

Read replica — điều cần nhớ Nội dung
Nhân bản BẤT ĐỒNG BỘ có độ trễ
Chỉ ĐỌC không ghi được
Thăng cấp promote-replica — MỘT CHIỀU
Theo dõi chỉ số replication lag
Nhiều replica cho một máy chính
Chi phí mỗi replica là một instance đầy đủ
Kế hoạch DR nên có gì Thành phần
RPO và RTO đã thống nhất với bên nghiệp vụ
Cross-region replica sẵn sàng thăng cấp
Sao lưu ở Region khác --backup-location
Quy trình viết ra giấy ai làm gì, theo thứ tự nào
DIỄN TẬP định kỳ quan trọng nhất
Ứng dụng đổi chuỗi kết nối nhanh tránh phải build lại
Điều dễ quên sau khi thăng cấp Nội dung
Instance mới KHÔNG có sẵn HA phải cấu hình lại
Chưa có sao lưu tự động bật ngay
Các replica khác không tự trỏ sang
IP và tên khác ứng dụng phải đổi cấu hình
Có thể mất vài giao dịch cuối do bất đồng bộ
Vì vậy viết sẵn kịch bản, đừng ứng biến lúc sự cố
Khi nào Cloud SQL không đủ cho DR Dấu hiệu
RPO gần bằng 0 trên nhiều Region → Cloud Spanner
Cần GHI ở nhiều Region cùng lúc → Spanner
SLA 99,999% → Spanner multi-region
Cloud SQL HA cho SLA 99,95%
Đánh đổi Spanner đắt hơn nhiều

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Có replica ở Region nào | gcloud sql instances list — xem cột Region | | Độ trễ nhân bản | chỉ số replication_lag trong Monitoring | | Sao lưu để ở đâu | describe → backupConfiguration.location |

Và điều quyết định một kế hoạch khôi phục thảm hoạ có giá trị hay không: đã từng diễn tập thăng cấp replica chưa. Cấu hình đúng trong describe không bảo đảm quy trình chạy trơn tru dưới áp lực — chuỗi kết nối hard-code trong ảnh container, quyền IAM thiếu, hay đơn giản là không ai nhớ tên lệnh, đều chỉ lộ ra khi bạn thật sự thử.