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

Tìm thấy 333 câu.

Câu 41 Data Pipeline Orchestration

Your pipeline for processing IoT sensor data must handle a continuous, high-volume stream of events in real-time. The pipeline needs to perform windowed aggregations on the data before storing the results in BigQuery. The entire solution must be serverless.

Which two services are most appropriate for this task?

  1. A Pub/Sub and Dataflow
  2. B Eventarc and Cloud Run
  3. C Cloud SQL and Cloud Functions
  4. D Cloud Storage and Dataproc
Xem giải thích

Đáp án

A — Pub/Sub và Dataflow.

Vì sao đúng

Đề có bốn ràng buộc: luồng sự kiện IoT liên tục, khối lượng lớn, xử lý thời gian thực, tổng hợp theo CỬA SỔ, và hoàn toàn không máy chủ. Cặp Pub/Sub + Dataflow là kiến trúc chuẩn cho đúng bài toán này.

⚠ Điểm mấu chốt — mỗi dịch vụ một vai trò:

Thiết bị IoT
        ↓
    PUB/SUB
        → thu nhận, làm BỘ ĐỆM
        → chịu được đỉnh tải
        → tách rời thiết bị khỏi xử lý
        ↓
    DATAFLOW (Apache Beam)
        → xử lý luồng
        → TỔNG HỢP THEO CỬA SỔ
        → xử lý dữ liệu tới muộn
        ↓
    BIGQUERY
        → lưu kết quả để phân tích

⚠ Cửa sổ — thứ chỉ Dataflow làm tốt trong bốn phương án:

FIXED WINDOW (cửa sổ cố định)
    → mỗi 5 phút một cửa sổ, không chồng lấn

SLIDING WINDOW (cửa sổ trượt)
    → 10 phút, trượt mỗi 1 phút → chồng lấn

SESSION WINDOW (cửa sổ phiên)
    → gom theo khoảng lặng giữa các sự kiện
        ↓
    Đây là mô hình của Apache Beam,
    Dataflow triển khai đầy đủ

⚠ Thời điểm sự kiện ↔ thời điểm xử lý — điều quyết định độ đúng:

Cảm biến IoT gửi lúc 10:00
        ↓
    Mạng chập chờn, tới hệ thống lúc 10:07
        ↓
    ⚠ Tính vào cửa sổ NÀO?

Beam dùng EVENT TIME
    → tính theo lúc SỰ KIỆN XẢY RA
        ↓
    + WATERMARK: ước lượng "đã nhận đủ chưa"
    + ALLOWED LATENESS: chấp nhận trễ bao lâu
    + TRIGGER: khi nào phát kết quả
        ↓
    → kết quả ĐÚNG dù dữ liệu tới lộn xộn

Xem thêm câu #12949 (cùng lô): nói riêng về vai trò bộ đệm của Pub/Sub. Và #12930 (lô 133): theo dõi chính pipeline Dataflow luồng này. Ba câu mô tả ba phần của cùng một kiến trúc.

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

  • B (Eventarc và Cloud Run) — đây là phương án gần nhất vì cũng không máy chủ và xử lý theo sự kiện, nhưng Cloud Run xử lý TỪNG request độc lập; nó không có mô hình cửa sổ, watermark hay trạng thái luồng. Tự dựng lại những thứ đó là công việc rất lớn.

  • D (Cloud Storage và Dataproc) — đây là mô hình xử lý theo LÔ, không phải thời gian thực; Dataproc cũng không phải serverless (trừ Serverless for Spark, nhưng vẫn thiên về lô).

  • C (Cloud SQL và Cloud Functions) — Cloud SQL không kham nổi luồng ghi lớn liên tục, và cũng không có cơ chế tổng hợp theo cửa sổ.

Ghi nhớ

⚠ Kiến trúc luồng chuẩn trên Google Cloud — bảng phải thuộc: | Vai trò | Dịch vụ | |---|---| | Thu nhận và làm bộ đệm | Pub/Sub | | Xử lý luồng, tổng hợp cửa sổ | Dataflow | | Lưu kết quả phân tích | BigQuery | | Lưu dữ liệu thô | Cloud Storage | | Trực quan hoá | Looker Studio | | Đặc thù IoT | thiết bị dùng MQTT → Pub/Sub qua cầu nối |

Từ khoá nhận diện:

"luồng thời gian thực + cửa sổ + serverless" → Pub/Sub + Dataflow "xử lý theo lô trên tệp" → Dataproc hoặc Dataflow batch "một sự kiện, một hàm nhỏ" → Cloud Run function "nạp thẳng vào BigQuery không cần xử lý" → BigQuery subscription của Pub/Sub "đã có sẵn job Spark" → Dataproc

Ba loại cửa sổ của Beam Loại
Fixed (tumbling) cố định, không chồng lấn — "mỗi 5 phút"
Sliding chồng lấn — "10 phút, trượt mỗi 1 phút"
Session theo khoảng lặng — phiên người dùng
Global một cửa sổ duy nhất, cần trigger tuỳ chỉnh
Chọn theo câu hỏi nghiệp vụ, không theo thói quen
Watermark, trigger, lateness Khái niệm
Watermark ước lượng "dữ liệu tới thời điểm T đã đủ"
Trigger khi nào PHÁT kết quả của cửa sổ
Allowed lateness chấp nhận dữ liệu trễ bao lâu
Accumulation mode phát lại toàn bộ hay chỉ phần thêm
Bẫy allowed lateness quá dài → giữ trạng thái rất lớn
Tối ưu pipeline luồng Cách
Streaming Engine tách trạng thái khỏi worker — co giãn tốt hơn
Dataflow Prime tự điều chỉnh tài nguyên theo bước
Autoscaling bật, đặt --maxNumWorkers hợp lý
Tránh hot key thêm thành phần ngẫu nhiên
Dead-letter bản ghi hỏng không được làm chết job
Storage Write API ghi vào BigQuery hiệu quả hơn
Thay thế nhẹ hơn khi không cần biến đổi Nội dung
Pub/Sub BigQuery subscription ghi thẳng vào BigQuery, KHÔNG cần Dataflow
Dùng được khi không cần tổng hợp hay biến đổi
Đề này CẦN tổng hợp theo cửa sổ → phải có Dataflow
Pub/Sub Cloud Storage subscription ghi thẳng thành tệp
Lợi ích rẻ hơn và đơn giản hơn khi đủ dùng

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Pipeline có theo kịp không | Data freshness trong Job metrics | | Pub/Sub có tồn đọng không | num_undelivered_messages | | Dữ liệu trễ có bị bỏ không | đếm bản ghi bị loại vì quá allowed lateness |

Và một quyết định thiết kế đáng cân nhắc kỹ với dữ liệu IoT: allowed lateness đặt bao lâu. Cảm biến ở vùng sóng yếu có thể gửi dữ liệu trễ hàng giờ; đặt quá ngắn thì mất dữ liệu, đặt quá dài thì pipeline phải giữ trạng thái của mọi cửa sổ mở trong suốt khoảng đó — và chi phí bộ nhớ của lựa chọn đó thường chỉ lộ ra khi hệ thống đã chạy được vài tuần.

Câu 42 Data Management

A new developer on your team needs full control over all objects within a specific Cloud Storage bucket. They need to be able to upload, download, list, and delete objects. However, they should not be able to delete the bucket itself or change its IAM policies.

Following the principle of least privilege, which predefined IAM role should you grant them?

  1. A Project Editor
  2. B Storage Admin
  3. C Storage Object Admin
  4. D Storage Legacy Bucket Owner
Xem giải thích

Đáp án

C — Storage Object Admin (roles/storage.objectAdmin).

Vì sao đúng

Yêu cầu tách rất rõ hai nhóm quyền: toàn quyền trên ĐỐI TƯỢNG (tải lên, tải xuống, liệt kê, xoá), nhưng KHÔNG được xoá bucket hay đổi IAM của bucket. Đó chính là ranh giới của objectAdmin.

⚠ Điểm mấu chốt — ranh giới giữa "đối tượng" và "bucket":

roles/storage.objectAdmin
        ↓
    CÓ:
      storage.objects.create  (tải lên)
      storage.objects.get     (tải xuống)
      storage.objects.list    (liệt kê)
      storage.objects.delete  (xoá)
      storage.objects.update
        ↓
    KHÔNG CÓ:
      storage.buckets.delete   ← không xoá bucket
      storage.buckets.setIamPolicy ← không đổi quyền
      storage.buckets.update
        ↓
    ⚠ Khớp CHÍNH XÁC yêu cầu của đề

⚠ Cấp ở đúng phạm vi — cũng là một phần của quyền tối thiểu:

gcloud storage buckets add-iam-policy-binding \
  gs://ten-bucket \
  --member="user:dev@congty.com" \
  --role="roles/storage.objectAdmin"
        ↓
    ⚠ Cấp TRÊN BUCKET, không phải trên PROJECT
        ↓
    Cấp ở cấp project → người đó có quyền
    trên MỌI bucket, kể cả những cái
    họ không nên chạm tới

⚠ Vì sao Storage Admin là quá rộng:

roles/storage.admin
        ↓
    = objectAdmin
      + TOÀN QUYỀN TRÊN BUCKET
        ↓
    → xoá được cả bucket
    → đổi được IAM policy
    → có thể tự cấp thêm quyền cho mình
        ↓
    ⚠ Vi phạm trực tiếp hai điều
      mà đề cấm

Xem thêm câu #12956 và #12957 (cùng lô): cùng chủ đề chọn vai trò tối thiểu, nhưng cho xem toàn project và cho chạy truy vấn BigQuery. Ba câu, ba vai trò khác nhau, cùng một nguyên tắc.

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

  • B (Storage Admin) — đây là phương án gần nhất và làm được mọi việc đề cần, nhưng nó thêm cả quyền xoá bucket và đổi IAM — đúng hai thứ đề cấm.

  • A (Project Editor) — quá rộng một cách nguy hiểm: quyền sửa gần như mọi tài nguyên trong toàn bộ project.

  • D (Storage Legacy Bucket Owner) — vai trò kế thừa từ hệ ACL cũ, cho quyền trên chính bucket (kể cả sửa metadata bucket), và không nên dùng cho phân quyền mới.

Ghi nhớ

⚠ Các vai trò Cloud Storage — bảng phải thuộc: | Vai trò | Cho phép | |---|---| | roles/storage.objectViewer | đọc và liệt kê đối tượng | | roles/storage.objectCreator | tạo mới — KHÔNG đọc, KHÔNG ghi đè | | roles/storage.objectUser | đọc, tạo, sửa, xoá đối tượng | | roles/storage.objectAdmin | toàn quyền ĐỐI TƯỢNG, không đụng bucket | | roles/storage.admin | cả bucket lẫn đối tượng | | roles/storage.legacy* | hệ ACL cũ — tránh dùng |

Từ khoá nhận diện:

"toàn quyền tệp, không đụng bucket" → storage.objectAdmin "chỉ tải lên, không đọc lại được" → storage.objectCreator — hay dùng cho nhật ký "chỉ đọc" → storage.objectViewer "tạo và xoá bucket" → storage.admin "Project Editor cho nhanh" → luôn là phương án SAI trong câu hỏi quyền tối thiểu

Nguyên tắc quyền tối thiểu — bốn câu hỏi Câu hỏi
AI người dùng, group, hay service account
LÀM GÌ vai trò hẹp nhất đủ dùng
TRÊN GÌ phạm vi: tài nguyên → project → folder → org
BAO LÂU cân nhắc IAM condition có hạn
Thực hành cấp cho GROUP, rà soát bằng Recommender
Vì sao objectCreator lại hữu ích Nội dung
Cho phép ghi tệp mới
Không cho đọc lại, ghi đè, xoá
Dùng cho ứng dụng ghi nhật ký, thu thập dữ liệu
Lợi ích kẻ chiếm được ứng dụng cũng không đọc được dữ liệu cũ
Kết hợp retention policy để chống xoá
Kiểm soát bucket toàn diện Lớp
Uniform bucket-level access tắt ACL từng đối tượng
Public Access Prevention chặn công khai
IAM ở cấp BUCKET không cấp ở cấp project
IAM condition giới hạn theo tiền tố tên đối tượng
Retention policy chống xoá sớm
Audit log Data Access log cho thao tác đọc/ghi
IAM condition — cách thu hẹp hơn nữa Ví dụ
Theo tiền tố tên chỉ được truy cập du-lieu/dev/*
Theo thời gian quyền hết hạn cuối quý
Theo địa chỉ IP chỉ từ mạng công ty (qua VPC-SC)
Cú pháp --condition=expression=...,title=...
Lưu ý không phải vai trò nào cũng hỗ trợ điều kiện

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai có quyền gì trên bucket | gcloud storage buckets get-iam-policy gs://b | | Vai trò gồm permission nào | gcloud iam roles describe roles/storage.objectAdmin | | Có quyền thừa không | IAM Recommender |

Và một chi tiết dễ bỏ qua khi cấp objectAdmin: cấp nó trên chính bucket, đừng cấp ở cấp project. Cùng một vai trò nhưng khác phạm vi là khác biệt giữa "một lập trình viên toàn quyền trên bucket của họ" và "một lập trình viên xoá được mọi tệp trong mọi bucket của công ty" — và cả hai trường hợp đều hiện lên như nhau trong danh sách vai trò nếu không nhìn kỹ phạm vi.

Câu 43 Data Preparation and Ingestion

You are performing a data cleaning task on customer data. The country_code column contains many inconsistent entries such as "US", "USA", "United States", and "us". Your process involves running a script to standardize all of these variations into a single, consistent format: "US".

This cleaning process is an example of what?

  1. A Data quality assessment
  2. B Data archiving
  3. C Data transformation
  4. D Data ingestion
Xem giải thích

Đáp án

C — Data transformation (biến đổi dữ liệu).

Vì sao đúng

Việc trong đề là thay đổi giá trị dữ liệu: đưa "US", "USA", "United States", "us" về cùng một dạng chuẩn "US". Thay đổi dữ liệu để nó dùng được chính là biến đổi.

⚠ Điểm mấu chốt — đánh giá ↔ biến đổi, ranh giới rất rõ:

ĐÁNH GIÁ CHẤT LƯỢNG (assess)
        ↓
    "Cột country_code có 4 biến thể
     khác nhau cho cùng một nước"
        ↓
    → PHÁT HIỆN vấn đề, KHÔNG sửa

BIẾN ĐỔI (transform)          ← đề này
        ↓
    "Chạy script đưa tất cả về 'US'"
        ↓
    → THAY ĐỔI dữ liệu để sửa vấn đề

⚠ Chuẩn hoá bằng SQL:

SELECT
  CASE UPPER(TRIM(country_code))
    WHEN 'US' THEN 'US'
    WHEN 'USA' THEN 'US'
    WHEN 'UNITED STATES' THEN 'US'
    WHEN 'U.S.A.' THEN 'US'
    ELSE UPPER(TRIM(country_code))
  END AS country_code_chuan
FROM `du_an.khach_hang`;

⚠ Cách làm bền hơn — bảng ánh xạ:

Thay vì CASE dài vô tận trong truy vấn
        ↓
    Tạo BẢNG ÁNH XẠ:
      gia_tri_tho | gia_tri_chuan
      'USA'       | 'US'
      'us'        | 'US'
      'Viet Nam'  | 'VN'
        ↓
    LEFT JOIN vào bảng đó
        ↓
    → thêm biến thể mới chỉ cần THÊM DÒNG,
      không phải sửa mã
    → giá trị KHÔNG khớp lộ ra ngay
      (thành NULL) → biết mà bổ sung

Xem thêm câu #12943 (cùng lô): cùng nói về khâu chuẩn bị dữ liệu, nhưng ở đó là KIỂM TRA xem dữ liệu có hợp lệ không → khoá là đánh giá chất lượng dữ liệu. Câu này là SỬA dữ liệu → biến đổi. Hai bước liên tiếp, hai khoá khác nhau, không mâu thuẫn.

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

  • A (đánh giá chất lượng dữ liệu) — đây là phương án gần nhất và là bước NGAY TRƯỚC: nó phát hiện ra rằng cột có nhiều biến thể, nhưng không sửa. Đề mô tả hành động sửa.

  • D (nạp dữ liệu) — đưa dữ liệu vào hệ thống, xảy ra trước cả hai bước trên.

  • B (lưu trữ dài hạn) — chuyển dữ liệu cũ sang nơi lưu rẻ, không liên quan.

Ghi nhớ

⚠ Các bước chuẩn bị dữ liệu — bảng phải thuộc: | Bước | Việc | |---|---| | Ingestion | đưa dữ liệu vào | | Assessing quality | PHÁT HIỆN vấn đề — không sửa | | Transformation | SỬA và định hình lại dữ liệu | | Loading | nạp vào kho đích | | Archiving | chuyển dữ liệu cũ sang lưu trữ rẻ |

Từ khoá nhận diện:

"chuẩn hoá, làm sạch, đổi kiểu, gộp" → biến đổi "kiểm tra rỗng, đúng định dạng, đúng khoảng" → đánh giá chất lượng "đưa dữ liệu vào hệ thống" → nạp "chuyển dữ liệu cũ sang lớp rẻ" → lưu trữ dài hạn "điều phối thứ tự các bước" → orchestration

Các phép biến đổi thường gặp Phép
Chuẩn hoá (standardization) đưa về cùng một dạng — như đề này
Làm sạch (cleansing) bỏ khoảng trắng, sửa lỗi chính tả
Ép kiểu (casting) chuỗi → số, chuỗi → ngày
Làm giàu (enrichment) thêm dữ liệu từ nguồn khác
Tổng hợp (aggregation) gộp theo nhóm
Phi chuẩn hoá gộp bảng cho truy vấn nhanh
Ẩn danh hoá che PII
Công cụ biến đổi trên Google Cloud Công cụ
SQL trong BigQuery đơn giản nhất khi dữ liệu đã ở đó
Dataform quản lý chuỗi biến đổi SQL, có kiểm thử
Dataflow biến đổi lô và luồng quy mô lớn
Cloud Data Fusion kéo thả, có Wrangler
Dataprep làm sạch trực quan
Dataproc Spark
Chuẩn hoá tốt cần gì Nội dung
Danh sách giá trị chuẩn ví dụ ISO 3166 cho mã quốc gia
Bảng ánh xạ có thể mở rộng thêm biến thể không phải sửa mã
Xử lý giá trị KHÔNG khớp đừng âm thầm bỏ qua
Ghi lại gì đã đổi phục vụ truy vết
Kiểm thử đảm bảo không phá dữ liệu đúng
Giữ dữ liệu thô hay không Nội dung
Nên giữ để chạy lại khi logic thay đổi
Mô hình raw → staging → curated ba tầng
ELT giữ thô trong kho, biến đổi bằng SQL
ETL biến đổi trước, chỉ khi tuân thủ bắt buộc
Nguyên tắc biến đổi phải LẶP LẠI ĐƯỢC từ dữ liệu thô

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Còn bao nhiêu biến thể | SELECT country_code, COUNT(*) GROUP BY 1 ORDER BY 2 DESC | | Có giá trị nào không ánh xạ được | LEFT JOIN bảng ánh xạ, tìm NULL | | Biến đổi có làm mất dòng không | so COUNT(*) trước và sau |

Và một điều nên chuẩn bị sẵn ngay khi viết bước chuẩn hoá đầu tiên: chỗ để chứa những giá trị không ánh xạ được. Dữ liệu thật luôn sinh ra biến thể mới — "U.S.", "United States of America", một khoảng trắng thừa — và một bảng liệt kê những giá trị chưa khớp là cách duy nhất để bạn biết mà bổ sung, thay vì để chúng lặng lẽ rơi vào nhóm "khác".

Câu 44 Data Pipeline Orchestration

A team regularly runs the same Spark job on a Dataproc cluster. They want to create a reusable, parameterizable definition of this job. This would allow anyone on the team to run the job with different input or output paths without having to remember all the specific command-line arguments.

Which Dataproc feature is designed for this purpose?

  1. A Cloud Composer
  2. B Cloud Functions
  3. C Using a custom Compute Engine startup script
  4. D Dataproc Workflow Templates
Xem giải thích

Đáp án

D — Dataproc Workflow Templates.

Vì sao đúng

Đề cần một định nghĩa job DÙNG LẠI ĐƯỢC và THAM SỐ HOÁ ĐƯỢC, để ai trong đội cũng chạy được với đường dẫn vào/ra khác nhau mà không phải nhớ đống đối số dòng lệnh. Workflow Template là tính năng của Dataproc cho đúng việc đó.

⚠ Điểm mấu chốt — template là bản khai job có tham số:

gcloud dataproc workflow-templates create xu-ly-ban-hang \
  --region=asia-southeast1

gcloud dataproc workflow-templates add-job spark \
  --workflow-template=xu-ly-ban-hang \
  --step-id=buoc-chinh \
  --class=com.congty.XuLy \
  --jars=gs://bucket/job.jar \
  -- --input=PLACEHOLDER --output=PLACEHOLDER

gcloud dataproc workflow-templates set-managed-cluster \
  --workflow-template=xu-ly-ban-hang \
  --cluster-name=cum-tam --num-workers=4
        ↓
    Chạy với tham số khác nhau:
      gcloud dataproc workflow-templates instantiate \
        xu-ly-ban-hang \
        --parameters="INPUT=gs://a,OUTPUT=gs://b"

⚠ Điều quan trọng nhất — CỤM ĐƯỢC QUẢN LÝ:

set-managed-cluster
        ↓
    Khi chạy template:
      1. Dataproc TỰ TẠO cụm
      2. Chạy các job theo thứ tự
      3. TỰ XOÁ cụm khi xong
        ↓
    ⚠ Không có cụm nào nằm không mà tính tiền
    ⚠ Không ai quên tắt cụm
        ↓
    → đây là mẫu tiết kiệm nhất
      cho job Spark chạy định kỳ

⚠ Template cũng khai được PHỤ THUỘC giữa các bước:

add-job ... --step-id=buoc-a
add-job ... --step-id=buoc-b --start-after=buoc-a
        ↓
    → một DAG nhỏ NGAY TRONG Dataproc
        ↓
    Khác Composer ở chỗ:
      phạm vi chỉ trong Dataproc,
      không điều phối dịch vụ khác

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

  • A (Cloud Composer) — đây là phương án gần nhất và hoàn toàn chạy được, nhưng đề hỏi rõ "tính năng nào CỦA DATAPROC". Composer là dịch vụ riêng, có chi phí môi trường thường trực, và là quá tay cho việc chuẩn hoá một job.

  • B (Cloud Functions) — chạy một đoạn mã ngắn, không phải cơ chế định nghĩa job Spark.

  • C (startup script tuỳ chỉnh) — chạy lúc VM khởi động; không tham số hoá job, không quản lý vòng đời cụm.

Ghi nhớ

⚠ Dataproc — các khái niệm cần thuộc: | Khái niệm | Nội dung | |---|---| | Workflow Template | định nghĩa job DÙNG LẠI, có THAM SỐ, có phụ thuộc | | Managed cluster | tự tạo và TỰ XOÁ cụm cho mỗi lần chạy | | Cluster selector | dùng cụm đang có, chọn theo nhãn | | Initialization action | script chạy khi tạo cụm | | Autoscaling policy | co giãn số worker | | Dataproc Serverless | chạy Spark KHÔNG cần cụm nào |

Từ khoá nhận diện:

"job Spark dùng lại, có tham số" → Workflow Template "chạy Spark không cần quản lý cụm" → Dataproc Serverless for Spark "điều phối NHIỀU dịch vụ khác nhau" → Cloud Composer "cụm luôn sẵn sàng cho nhiều người dùng" → cụm thường trực + autoscaling "cài thư viện lúc tạo cụm" → initialization action

Ba mẫu dùng Dataproc Mẫu
Cụm tạm (ephemeral) tạo – chạy – xoá, rẻ nhất
Cụm thường trực cho công việc tương tác, notebook
Dataproc Serverless không có cụm — Google lo hết
Khuyến nghị cụm tạm hoặc serverless cho job theo lịch
Sai lầm phổ biến cụm thường trực bị bỏ quên — hoá đơn im lặng
Dataproc Serverless — đáng cân nhắc Nội dung
Không tạo cụm nộp batch, Google lo tài nguyên
Trả tiền theo tài nguyên job thật sự dùng
Lệnh gcloud dataproc batches submit spark ...
Hợp với job Spark chạy rời rạc
Chưa hợp với job cần cấu hình cụm rất đặc thù
So với Workflow Template đơn giản hơn nữa nếu không cần nhiều bước
Tiết kiệm chi phí Dataproc Cách
Cụm tạm cho mỗi lần chạy không có thời gian nhàn rỗi
Preemptible / Spot worker rẻ hơn nhiều cho job chịu được gián đoạn
Autoscaling policy co giãn theo tải
Xoá cụm tự động --max-idle, --max-age
Lưu dữ liệu ở GCS, không ở HDFS cụm xoá đi dữ liệu vẫn còn
Nguyên tắc cụm là tài nguyên tính toán, không phải nơi lưu dữ liệu
Khi nào cần Composer bên cạnh Dataproc Dấu hiệu
Luồng đi qua NHIỀU dịch vụ Dataproc → BigQuery → thông báo
Phụ thuộc phức tạp, rẽ nhánh
Cần backfill quá khứ
Nếu chỉ trong Dataproc Workflow Template là đủ và rẻ hơn
Kết hợp Composer gọi Workflow Template

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Template khai gì | gcloud dataproc workflow-templates describe <ten> --region=<r> | | Lần chạy gần nhất ra sao | gcloud dataproc operations list | | Cụm có bị bỏ quên không | gcloud dataproc clusters list — kiểm tra định kỳ |

Và một khoản chi phí rất hay bị bỏ quên với Dataproc: cụm thường trực không ai dùng. Workflow Template với managed cluster loại bỏ hoàn toàn rủi ro đó — cụm sinh ra khi cần và biến mất khi xong, nên không có cách nào để quên tắt nó.

Câu 45 Data Management

You have a Cloud SQL for MySQL database that is critical for business operations. Your company's disaster recovery policy requires that the database can withstand a full regional outage.

What is the most straightforward, built-in feature you should configure for this Cloud SQL instance?

  1. A Increase the instance's vCPU and RAM.
  2. B Enable automated backups.
  3. C Configure a cross-region read replica.
  4. D Export the database to Cloud Storage daily.
Xem giải thích

Đáp án

C — Cấu hình một cross-region read replica (bản sao đọc ở Region khác).

Vì sao đúng

Yêu cầu là chịu được sự cố của CẢ MỘT REGION. Muốn vậy, dữ liệu phải có bản sao ở một Region khác, và Cloud SQL có sẵn tính năng đó.

⚠ Đ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
        ↓
    ⚠ Cả Region chết → KHÔNG cứu được

CROSS-REGION READ REPLICA      ← đề này
        ↓
    Bản sao ở REGION KHÁC HẲN
        ↓
    Region chính chết
        ↓
    → THĂNG CẤP replica thành máy chính độc lập
    → dịch vụ hoạt động trở lại

⚠ 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,
    ghi được
        ↓
    Trỏ ứng dụng sang instance mới
        ↓
    ⚠ Đây là 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

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

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

RTO (Recovery Time Objective)
    → chấp nhận NGỪNG bao lâu
    → thăng cấp replica: vài phút
        ↓
    Cần RPO = 0 và đa Region
      → phải dùng CLOUD SPANNER,
        không phải Cloud SQL

Xem thêm câu #12932 (cùng lô): cũng về bảo vệ dữ liệu của Cloud SQL, nhưng ở đó là khôi phục về một thời điểm → khoá là sao lưu tự động + PITR. Hai khoá khác nhau vì chống hai loại rủi ro khác nhau: PITR chống lỗi con người, replica đa Region chống sự cố hạ tầng. Một hệ thống nghiêm túc cần cả hai.

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

  • B (bật sao lưu tự động) — đây là phương án gần nhất và 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. Nó không phải cơ chế chịu lỗi Region.

  • D (xuất CSDL sang Cloud Storage hằng ngày) — thủ công, chậm, mất tới một ngày dữ liệu, và cũng cần chọn bucket đa vùng mới thật sự an toàn.

  • A (tăng vCPU và RAM) — cải thiện hiệu năng, không liên quan gì tới tính sẵn sàng.

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:

"chịu được mất cả Region" → cross-region read replica "chịu được mất 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 trên nhiều Region" → Cloud Spanner, không phải Cloud SQL

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 gcloud sql instances promote-replica — MỘT CHIỀU
Theo dõi độ trễ chỉ số replication lag
Số lượng nhiều replica cho một máy chính
Chi phí mỗi replica là một instance đầy đủ
Kế hoạch khôi phục thảm hoạ 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 được chuỗi kết nối nhanh tránh phải build lại
Điều dễ quên khi thăng cấp replica Nội dung
Thao tác MỘT CHIỀU không quay lại làm replica
Mất vài giao dịch cuối do nhân bản bất đồng bộ
Instance mới KHÔNG có sẵn HA phải cấu hình lại
Các replica khác không tự trỏ sang máy mới
IP và tên khác ứng dụng phải đổi cấu hình
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 đủ 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 → Cloud 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 bao nhiêu | chỉ số replication_lag trong Monitoring | | Sao lưu để ở đâu | gcloud sql instances 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 chưa. Một cross-region replica cấu hình đúng nhưng chưa ai từng thăng cấp thử sẽ để lộ đủ thứ bất ngờ vào đúng lúc tệ nhất — 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.

Câu 46 Data Management

A project manager is joining your team. They need to be able to see all the resources inside your Google Cloud project, such as BigQuery datasets and Cloud Storage buckets, but they must not have any permissions to modify, delete, or create resources.

Which basic IAM role should you grant them at the project level?

  1. A Browser
  2. B Viewer
  3. C Editor
  4. D Owner
Xem giải thích

Đáp án

B — Viewer.

Vì sao đúng

Yêu cầu là NHÌN THẤY mọi tài nguyên trong project — dataset BigQuery, bucket Cloud Storage — nhưng không được sửa, xoá hay tạo gì. Đó chính là vai trò cơ bản Viewer.

⚠ Điểm mấu chốt — ba vai trò cơ bản (basic role):

VIEWER   → đọc MỌI tài nguyên       ← đề này
           không thay đổi được gì

EDITOR   → Viewer + SỬA, TẠO, XOÁ
           hầu hết tài nguyên

OWNER    → Editor + quản lý IAM,
           quản lý thanh toán

⚠ Vì sao Browser lại KHÔNG đủ:

roles/browser
        ↓
    Chỉ cho phép DUYỆT CÂY TÀI NGUYÊN:
      thấy project, folder, organization
      trong cấu trúc phân cấp
        ↓
    ⚠ KHÔNG cho xem NỘI DUNG:
      không thấy dataset BigQuery,
      không thấy bucket Cloud Storage
        ↓
    → dùng cho công cụ cần biết cây tổ chức,
      không dùng cho người cần xem tài nguyên

⚠ Cấp Viewer:

gcloud projects add-iam-policy-binding DU-AN \
  --member="user:pm@congty.com" \
  --role="roles/viewer"

⚠ Và một cảnh báo quan trọng về Viewer:

⚠ Viewer cho phép ĐỌC DỮ LIỆU, không chỉ
  xem danh sách tài nguyên
        ↓
    → đọc được NỘI DUNG bảng BigQuery
    → đọc được NỘI DUNG tệp trong bucket
        ↓
    Nếu chỉ cần "thấy có những gì"
    mà KHÔNG được đọc dữ liệu
        ↓
    → dùng roles/browser + các vai trò
      metadata hẹp, chứ không dùng Viewer

Xem thêm câu #12957 (cùng lô): cũng về quyền tối thiểu nhưng cho chạy truy vấn BigQuery → khoá là BigQuery Data Viewer + Job User. Và #12952 (cùng lô) cho quản lý tệp trong bucket → Storage Object Admin. Ba câu, ba mức phạm vi.

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

  • A (Browser) — đây là phương án gần nhất và đúng là vai trò rất hẹp, nhưng nó chỉ cho duyệt cấu trúc phân cấp (project, folder), không cho xem dataset hay bucket như đề yêu cầu.

  • C (Editor) — cho phép sửa, tạo, xoá — vi phạm trực tiếp yêu cầu.

  • D (Owner) — rộng nhất, kể cả quản lý IAM và thanh toán.

Ghi nhớ

⚠ Ba vai trò cơ bản — bảng phải thuộc: | Vai trò | Cho phép | |---|---| | roles/viewer | ĐỌC mọi tài nguyên, không thay đổi gì | | roles/editor | Viewer + tạo, sửa, xoá | | roles/owner | Editor + quản lý IAM và thanh toán | | roles/browser | chỉ duyệt CÂY tài nguyên — không phải basic role | | Khuyến nghị của Google | hạn chế basic role, ưu tiên vai trò ĐỊNH SẴN theo dịch vụ |

Từ khoá nhận diện:

"xem mọi thứ, không sửa gì" → roles/viewer "chỉ thấy cây project/folder" → roles/browser "xem nhưng KHÔNG được đọc dữ liệu" → vai trò metadata của từng dịch vụ "quản lý quyền của người khác" → roles/resourcemanager.projectIamAdmin "cấp Editor cho nhanh" → luôn sai trong câu hỏi quyền tối thiểu

Vì sao Google khuyên tránh basic role Lý do
Quá rộng Editor có hàng nghìn permission
Không rà soát nổi không biết cụ thể ai làm được gì
Mở rộng theo thời gian Google thêm dịch vụ mới → Editor tự có quyền
Khó tuân thủ kiểm toán viên không chấp nhận
Thay thế vai trò định sẵn theo dịch vụ
Vai trò "chỉ xem" theo từng dịch vụ Vai trò
BigQuery roles/bigquery.dataViewer, roles/bigquery.metadataViewer
Cloud Storage roles/storage.objectViewer
Compute Engine roles/compute.viewer
Logging roles/logging.viewer
Monitoring roles/monitoring.viewer
Ưu điểm hẹp hơn roles/viewer rất nhiều
Cho người quản lý dự án — bộ vai trò thực tế Vai trò
roles/browser thấy cấu trúc project
roles/bigquery.metadataViewer thấy có bảng gì, KHÔNG đọc dữ liệu
roles/monitoring.viewer xem tình trạng hệ thống
roles/billing.viewer xem chi phí — thường là thứ họ cần nhất
So với roles/viewer hẹp hơn, và thường ĐỦ hơn với nhu cầu thật
Rà soát quyền định kỳ Công cụ
IAM Recommender gợi ý hạ vai trò không dùng tới
Policy Analyzer ai có quyền gì trên tài nguyên nào
Cloud Asset Inventory ảnh chụp toàn bộ chính sách
Audit log ai thực sự đã làm gì
Nhịp độ mỗi quý, và ngay khi có người rời đội

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai có vai trò gì | gcloud projects get-iam-policy <id> | | Vai trò gồm những quyền nào | gcloud iam roles describe roles/viewer | | Có quyền thừa không | IAM Recommender |

Và một câu nên hỏi trước khi cấp roles/viewer cho người quản lý dự án: họ có thật sự cần ĐỌC dữ liệu, hay chỉ cần biết có những gì và tốn bao nhiêu? Rất thường xuyên, câu trả lời là vế sau — và khi đó roles/browser cộng với quyền xem chi phí vừa đủ dùng, vừa không đặt toàn bộ dữ liệu khách hàng vào tầm tay một người không cần tới nó.

Câu 47 Data Management

A new junior data analyst has joined your team. Their only responsibility is to run pre-written SELECT queries in BigQuery to populate reports. They must not be able to change or delete any data or tables.

Following the principle of least privilege, which two Identity and Access Management (IAM) roles should you grant to this user?

  1. A BigQuery Data Viewer and BigQuery Job User
  2. B BigQuery Data Editor and BigQuery Job User
  3. C BigQuery Admin and Project Viewer
  4. D BigQuery Data Owner
Xem giải thích

Đáp án

A — BigQuery Data Viewer và BigQuery Job User.

Vì sao đúng

Chạy được một câu SELECT trong BigQuery cần HAI quyền tách rời: quyền ĐỌC DỮ LIỆU, và quyền CHẠY JOB. Thiếu một trong hai là không làm việc được.

⚠ Điểm mấu chốt — vì sao phải có đủ hai:

roles/bigquery.dataViewer
        ↓
    Đọc dữ liệu và siêu dữ liệu của
    bảng, view, dataset
        ↓
    ⚠ Nhưng KHÔNG chạy được truy vấn nào

roles/bigquery.jobUser
        ↓
    Tạo và chạy JOB (truy vấn, nạp, xuất)
    trong project
        ↓
    ⚠ Nhưng KHÔNG đọc được bảng nào
        ↓
    → PHẢI CÓ CẢ HAI

⚠ Vì sao BigQuery tách hai thứ này:

Trong BigQuery:
    DỮ LIỆU nằm ở một project
    CHI PHÍ TRUY VẤN tính cho project
      CHẠY JOB
        ↓
    → hai thứ có thể ở HAI PROJECT KHÁC NHAU
        ↓
    dataViewer  → cấp trên DATASET (nơi có dữ liệu)
    jobUser     → cấp trên PROJECT (nơi trả tiền)
        ↓
    ⚠ Đây là mô hình rất mạnh:
      dữ liệu tập trung, chi phí phân bổ
      về từng đội

⚠ Cấp đúng phạm vi:

# quyền đọc, trên chính DATASET
bq add-iam-policy-binding \
  --member="user:analyst@congty.com" \
  --role="roles/bigquery.dataViewer" \
  du_an:bao_cao

# quyền chạy job, trên PROJECT
gcloud projects add-iam-policy-binding DU-AN \
  --member="user:analyst@congty.com" \
  --role="roles/bigquery.jobUser"

Xem thêm câu #12956 và #12952 (cùng lô): cùng nguyên tắc quyền tối thiểu, cho xem toàn project và cho quản lý tệp trong bucket. Ba câu nhất quán.

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

  • B (Data Editor + Job User) — đây là phương án gần nhất và chạy được truy vấn, nhưng dataEditor cho phép SỬA và XOÁ dữ liệu, tạo và xoá bảng — đúng điều đề cấm.

  • C (BigQuery Admin + Project Viewer) — bigquery.admin là toàn quyền BigQuery, rộng hơn hẳn mức cần.

  • D (BigQuery Data Owner) — toàn quyền trên dataset kể cả xoá; hơn nữa một mình nó cũng không đủ vì thiếu quyền chạy job.

Ghi nhớ

⚠ Các vai trò BigQuery — bảng phải thuộc: | Vai trò | Cho phép | |---|---| | roles/bigquery.dataViewer | ĐỌC dữ liệu và siêu dữ liệu | | roles/bigquery.dataEditor | đọc + ghi, tạo, xoá bảng | | roles/bigquery.dataOwner | + quản lý quyền của dataset | | roles/bigquery.jobUser | CHẠY job — không đọc được dữ liệu | | roles/bigquery.user | jobUser + tạo dataset + đọc siêu dữ liệu | | roles/bigquery.metadataViewer | thấy có bảng gì, KHÔNG đọc nội dung | | roles/bigquery.admin | toàn quyền |

Từ khoá nhận diện:

"chỉ chạy SELECT, không sửa gì" → dataViewer + jobUser "cần tạo bảng riêng của mình" → roles/bigquery.user trên project "thấy tên bảng nhưng không đọc dữ liệu" → metadataViewer "nạp và xoá dữ liệu" → dataEditor "một vai trò là đủ" → thường SAI với BigQuery

Vì sao tách quyền dữ liệu và quyền job Nội dung
Chi phí truy vấn tính cho project chạy job
Dữ liệu có thể ở project khác
Kết quả một dataset dùng chung, nhiều đội tự trả tiền truy vấn của mình
Cách làm mỗi đội một project, cấp jobUser ở project của họ
Và cấp dataViewer trên dataset dùng chung
Kiểm soát chi tiết hơn dataViewer Cách
Authorized view chỉ lộ kết quả của view, giấu bảng gốc
Column-level security policy tag trên cột nhạy cảm
Row-level security mỗi người chỉ thấy dòng của mình
Dynamic data masking che giá trị theo vai trò
Với nhà phân tích mới thường nên bắt đầu bằng authorized view
Kiểm soát chi phí cho người dùng mới Cách
maximum_bytes_billed trần cho mỗi truy vấn
Custom quota ở cấp người dùng trần theo ngày
Reservation riêng với mô hình slot
Cảnh báo ngân sách biết sớm
Vì sao cần một SELECT * trên bảng lớn tốn rất nhanh
Bộ quyền theo vai trò công việc Vai trò
Nhà phân tích chỉ đọc dataViewer + jobUser
Kỹ sư dữ liệu dataEditor + jobUser trên dataset của họ
Chủ sở hữu dataset dataOwner
Service account của pipeline dataEditor trên đúng dataset đích
Người xem dashboard thường không cần quyền nếu dùng owner's credentials

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai có quyền trên dataset | bq show --format=prettyjson <dataset> → access | | Ai chạy được job | gcloud projects get-iam-policy <id>, tìm jobUser | | Vì sao bị từ chối | Policy Troubleshooter |

Và một lỗi cấu hình rất hay gặp khi phân quyền BigQuery lần đầu: cấp đủ quyền đọc nhưng quên jobUser. Người dùng nhìn thấy bảng trong giao diện, mở được lược đồ, nhưng mỗi lần bấm chạy truy vấn lại nhận lỗi quyền — và thông báo lỗi nói về "job", chứ không nói về bảng, nên rất dễ dẫn người ta đi tìm sai chỗ.

Câu 48 Data Preparation and Ingestion

A data pipeline extracts raw user event data from a source system, loads it directly into a staging table in BigQuery, and then runs a series of SQL scripts within BigQuery to clean, transform, and aggregate the data into a final reporting table.

What is this data manipulation methodology called?

  1. A ETL (Extract, Transform, Load)
  2. B ETLT (Extract, Transform, Load, Transform)
  3. C Reverse ETL
  4. D ELT (Extract, Load, Transform)
Xem giải thích

Đáp án

D — ELT (Extract, Load, Transform — trích xuất, nạp, biến đổi).

Vì sao đúng

Đề mô tả rõ thứ tự: trích xuất dữ liệu thô → nạp THẲNG vào bảng staging trong BigQuery → rồi mới chạy loạt script SQL để làm sạch và tổng hợp. Biến đổi xảy ra SAU khi nạp, ngay bên trong kho.

⚠ Điểm mấu chốt — thứ tự các chữ cái chính là câu trả lời:

ELT = Extract → LOAD → Transform     ← đề này
        ↓
    Nạp DỮ LIỆU THÔ vào kho trước
        ↓
    Biến đổi bằng SQL NGAY TRONG BigQuery
        ↓
    raw → staging → curated

ETL = Extract → TRANSFORM → Load
        ↓
    Biến đổi Ở NGOÀI kho, rồi mới nạp
    kết quả đã sạch

⚠ Vì sao ELT trở thành mặc định với BigQuery:

Kho hiện đại rất mạnh và co giãn
        ↓
    BigQuery biến đổi hàng tỉ dòng
    nhanh hơn hầu hết công cụ ngoài
        ↓
    + Giữ được DỮ LIỆU THÔ
        ↓
    → đổi logic biến đổi → CHẠY LẠI từ thô
    → không phải trích xuất lại từ nguồn
    → triển khai nhanh hơn, ít hạ tầng hơn

⚠ Cấu trúc ba tầng điển hình:

RAW (thô)
    → y hệt nguồn, không sửa gì
    → là "bản ghi gốc"

STAGING (trung gian)
    → làm sạch, chuẩn hoá kiểu,
      loại trùng

CURATED / MART (đã sẵn sàng)
    → mô hình cho nghiệp vụ,
      bảng tổng hợp cho báo cáo
        ↓
    Dataform hoặc dbt quản lý
    các bước SQL này

Xem thêm câu #12913 (lô 133): cùng dạng câu hỏi nhưng ở đó chính sách bắt che PII TRƯỚC khi vào kho → khoá là ETL. Hai khoá khác nhau vì ràng buộc khác nhau, không mâu thuẫn. Quy tắc: dữ liệu nhạy cảm không được vào kho → ETL; còn lại → ELT.

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

  • A (ETL) — đây là phương án đối lập trực tiếp: nó biến đổi TRƯỚC khi nạp, còn đề nói rõ dữ liệu thô được nạp thẳng rồi mới xử lý.

  • B (ETLT) — không phải thuật ngữ chuẩn được dùng để mô tả luồng này; đề khớp chính xác với ELT.

  • C (Reverse ETL) — đưa dữ liệu TỪ kho NGƯỢC RA các hệ thống nghiệp vụ như CRM. Hướng ngược lại.

Ghi nhớ

⚠ ETL ↔ ELT — bảng phải thuộc: | | ETL | ELT | |---|---|---| | Thứ tự | biến đổi TRƯỚC khi nạp | nạp TRƯỚC, biến đổi sau | | Nơi biến đổi | công cụ ngoài (Dataflow, Data Fusion) | trong kho (BigQuery SQL) | | Dữ liệu thô | KHÔNG vào kho | có trong kho | | Chạy lại logic mới | phải trích xuất lại từ nguồn | chạy lại từ dữ liệu thô | | Hợp với | tuân thủ, PII không được vào kho | hầu hết trường hợp còn lại | | Chi phí lưu | thấp hơn | cao hơn (giữ cả thô) |

Từ khoá nhận diện:

"nạp thô rồi biến đổi bằng SQL trong kho" → ELT "làm sạch/che PII trước khi nạp" → ETL "đẩy dữ liệu từ kho ra CRM" → Reverse ETL "truy vấn tại nguồn, không di chuyển" → data virtualization / external table "quản lý các bước SQL có kiểm thử" → Dataform

Công cụ cho ELT trên Google Cloud Công cụ
BigQuery SQL công cụ biến đổi chính
Dataform quản lý phụ thuộc, kiểm thử, phiên bản của SQL
Scheduled query chạy các bước theo lịch, đơn giản nhất
Cloud Composer điều phối nếu có bước ngoài BigQuery
Data Transfer Service phần "Extract + Load"
Datastream CDC từ CSDL vào BigQuery
Vì sao giữ dữ liệu thô lại đáng giá Lý do
Logic nghiệp vụ THAY ĐỔI chạy lại không cần đụng nguồn
Phát hiện lỗi biến đổi so lại với thô
Yêu cầu kiểm toán truy vết từ số cuối về dữ liệu gốc
Câu hỏi mới xuất hiện dữ liệu thô có thứ mà bản đã tổng hợp bỏ đi
Cái giá chi phí lưu trữ — thường rất nhỏ so với lợi ích
Dataform — vì sao nên dùng cho ELT Nội dung
Khai phụ thuộc giữa các bảng ref()
Assertion kiểm thử chất lượng ngay trong pipeline
Quản lý phiên bản bằng Git review được
Môi trường dev/prod không phá dữ liệu thật
Miễn phí chỉ trả tiền truy vấn BigQuery
Thay thế dbt cũng chạy tốt trên BigQuery
Khi nào vẫn phải chọn ETL Trường hợp
PII không được phép vào kho quy định ngành
Dữ liệu quá lớn, chỉ cần một phần nhỏ lọc trước cho rẻ
Nguồn cần biến đổi phức tạp phi SQL xử lý ảnh, văn bản
Kho đích không đủ mạnh không phải trường hợp của BigQuery
Mọi trường hợp khác ELT đơn giản và linh hoạt hơn

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bảng thô có còn nguyên vẹn không | so số dòng với nguồn | | Các bước biến đổi có chạy đúng thứ tự | đồ thị phụ thuộc của Dataform, hoặc lịch sử scheduled query | | Kết quả cuối có khớp không | assertion hoặc truy vấn đối chiếu |

Và một điều nên thống nhất từ đầu khi chọn ELT: quy tắc giữ dữ liệu thô bao lâu. Giữ mãi thì chi phí lưu tăng dần và dữ liệu cũ chẳng ai dùng; xoá sớm thì mất khả năng chạy lại. Một chính sách rõ ràng — ví dụ giữ thô 13 tháng rồi chuyển sang Cloud Storage Archive — trả lời được cả hai lo ngại mà không cần tranh luận lại mỗi quý.

Câu 49 Data Preparation and Ingestion

You need to load a dataset from a CSV file located in a Cloud Storage bucket into a new BigQuery table.

You want to use the BigQuery web UI to perform this action. Which set of steps should you follow?

  1. A In the BigQuery UI, write a SQL query using LOAD DATA.
  2. B In the BigQuery UI, select the destination dataset, click 'Create Table', and choose 'Google Cloud Storage' as the source.
  3. C In the IAM UI, grant the BigQuery service account access to the file.
  4. D In the Cloud Storage UI, select the file and click 'Export to BigQuery'.
Xem giải thích

Đáp án

B — Trong giao diện BigQuery, chọn dataset đích, bấm 'Create Table', rồi chọn nguồn là 'Google Cloud Storage'.

Vì sao đúng

BigQuery có sẵn luồng tạo bảng từ tệp trong Cloud Storage ngay trong giao diện web, và đó là cách làm chuẩn.

⚠ Điểm mấu chốt — luồng thao tác đầy đủ:

BigQuery UI → chọn DATASET đích
        ↓
    Bấm "Create Table"
        ↓
    Create table from: Google Cloud Storage
    Select file: gs://bucket/du-lieu.csv
    File format: CSV
        ↓
    Destination: tên bảng mới
        ↓
    Schema: Auto detect, hoặc khai tay
        ↓
    Advanced options:
      Header rows to skip: 1
      Field delimiter
      Allow jagged rows
      Number of errors allowed
        ↓
    Bấm "Create table"

⚠ Vì sao KHÔNG có nút "Export to BigQuery" trong Cloud Storage:

Cloud Storage là KHO ĐỐI TƯỢNG
        ↓
    Nó không biết gì về BigQuery
        ↓
    ⚠ Luồng luôn bắt đầu TỪ PHÍA BIGQUERY
      (hoặc từ lệnh bq load)
        ↓
    → đây là bẫy hay gặp trong đề

⚠ LOAD DATA có tồn tại, nhưng không phải luồng của câu hỏi:

LOAD DATA INTO du_an.bang_moi
FROM FILES (
  format = 'CSV',
  uris = ['gs://bucket/du-lieu.csv'],
  skip_leading_rows = 1
);
        ↓
    ⚠ Câu lệnh này CÓ THẬT trong BigQuery
    → nhưng đề hỏi luồng qua GIAO DIỆN,
      và phương án A không mô tả đúng cách dùng

Xem thêm câu #12911 (lô 133): cùng việc nạp CSV nhưng bằng dòng lệnh → khoá là bq load. Hai câu là hai cách làm cùng một việc, khoá nhất quán.

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

  • A (viết truy vấn SQL dùng LOAD DATA) — đây là phương án gần nhất vì LOAD DATA thật sự tồn tại trong BigQuery, nhưng đề hỏi luồng tạo bảng qua giao diện, và phương án B mô tả đúng các bước chuẩn.

  • D (trong giao diện Cloud Storage bấm 'Export to BigQuery') — không có chức năng này; Cloud Storage không khởi tạo được việc nạp vào BigQuery.

  • C (cấp quyền cho service account trong IAM) — quyền là điều kiện cần, nhưng bản thân nó không nạp dữ liệu.

Ghi nhớ

⚠ Bốn cách nạp dữ liệu từ GCS vào BigQuery — bảng phải thuộc: | Cách | Dùng khi | |---|---| | Giao diện: Create Table → Google Cloud Storage | thao tác một lần, trực quan | | bq load (dòng lệnh) | script, tự động hoá | | LOAD DATA (SQL) | nạp trong một truy vấn, dễ đưa vào scheduled query | | External table | truy vấn TẠI CHỖ, không nạp | | Data Transfer Service | nạp theo LỊCH từ GCS |

Từ khoá nhận diện:

"qua giao diện web" → Create Table → Google Cloud Storage "dòng lệnh" → bq load "nạp lặp lại theo lịch" → Data Transfer Service "không muốn nạp, chỉ truy vấn" → external table / BigLake "Export to BigQuery trong GCS" → KHÔNG TỒN TẠI

Các tuỳ chọn quan trọng khi nạp CSV Tuỳ chọn
Skip leading rows bỏ dòng tiêu đề
Auto detect schema tiện nhưng hay đoán sai kiểu
Field delimiter dấu phẩy, tab, hoặc khác
Allow quoted newlines ô có xuống dòng
Allow jagged rows dòng thiếu cột cuối
Number of errors allowed bỏ qua N dòng hỏng
Write preference ghi đè, nối thêm, hay chỉ khi bảng trống
Quyền cần có để nạp Quyền
roles/bigquery.dataEditor trên dataset đích
roles/bigquery.jobUser trên project chạy job
roles/storage.objectViewer trên bucket nguồn
Thiếu quyền nào thông báo lỗi thường nói rõ tài nguyên nào
Kiểm tra Policy Troubleshooter
Ưu điểm khi nạp từ GCS thay vì từ máy Nội dung
Không giới hạn kích thước như tải lên trực tiếp
Nạp SONG SONG nhiều tệp dùng ký tự đại diện gs://b/prefix-*.csv
Nạp lại được tệp vẫn còn ở GCS
Miễn phí nạp theo lô vào BigQuery không tính tiền
Định dạng tốt nhất Avro, Parquet thay vì CSV
Sau khi nạp — ba việc kiểm Việc
Số dòng so với tệp gốc
Lược đồ bq show --schema — kiểm cột bị đoán sai kiểu
Giá trị null bất thường dấu hiệu ép kiểu hỏng
Nếu sai nạp lại với lược đồ khai tường minh
Job lỗi bq show -j <job_id> để xem chi tiết

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bảng đã có dữ liệu chưa | bq show <dataset>.<bảng> → Num Rows | | Kiểu cột có đúng không | bq show --schema --format=prettyjson | | Có dòng nào bị bỏ không | bq show -j <job_id> → số bản ghi lỗi |

Và một tuỳ chọn nên cân nhắc kỹ mỗi lần nạp CSV: "Number of errors allowed". Đặt lớn cho job chạy trót lọt nhưng âm thầm bỏ đi hàng nghìn dòng; đặt bằng 0 thì một dòng hỏng làm hỏng cả lần nạp. Cách cân bằng thường tốt nhất là đặt bằng 0 và sửa dữ liệu nguồn — vì một bảng thiếu dữ liệu mà không ai biết còn nguy hiểm hơn một lần nạp thất bại.

Câu 50 Data Preparation and Ingestion

You are inspecting a data file and see that it is structured with key-value pairs, where values can be strings, numbers, or even nested objects containing more key-value pairs.

The entire file is enclosed in curly braces {}.

Which data format are you looking at?

  1. A Apache Avro
  2. B JSON
  3. C Apache Parquet
  4. D CSV
Xem giải thích

Đáp án

B — JSON.

Vì sao đúng

Đề mô tả ba đặc điểm nhận dạng của JSON: cặp khoá–giá trị, giá trị có thể là chuỗi, số, hoặc ĐỐI TƯỢNG LỒNG NHAU, và cả tệp bọc trong dấu ngoặc nhọn {}.

⚠ Điểm mấu chốt — hình dạng của JSON:

{
  "khach_hang_id": 12345,
  "ten": "Nguyen Van An",
  "dia_chi": {
    "thanh_pho": "Ha Noi",
    "quoc_gia": "VN"
  },
  "don_hang": [
    {"id": "A1", "tong": 250000},
    {"id": "A2", "tong": 480000}
  ]
}
        ↓
    ⚠ Ngoặc NHỌN {} → đối tượng
    ⚠ Ngoặc VUÔNG [] → mảng
    ⚠ Lồng nhau tuỳ ý → đây là điểm
      CSV không làm được

⚠ JSON ↔ Avro ↔ Parquet ↔ CSV — nhận dạng nhanh:

JSON     → VĂN BẢN đọc được, {} và [],
           lồng nhau
Avro     → NHỊ PHÂN, theo DÒNG,
           lược đồ nhúng dạng JSON
Parquet  → NHỊ PHÂN, theo CỘT
CSV      → VĂN BẢN, phẳng, ngăn cách
           bằng dấu phẩy
        ↓
    Chỉ JSON và CSV mở được bằng
    trình soạn thảo văn bản

⚠ Với BigQuery — phải là NDJSON, không phải JSON thường:

BigQuery nạp JSON theo dạng
    NEWLINE DELIMITED JSON (NDJSON)
        ↓
    MỖI DÒNG là MỘT đối tượng JSON hoàn chỉnh:
      {"id":1,"ten":"An"}
      {"id":2,"ten":"Binh"}
        ↓
    ⚠ KHÔNG phải một mảng lớn bọc cả tệp
    → dạng mảng phải chuyển đổi trước

Xem thêm câu #12950 (cùng lô): cùng bộ bốn phương án nhưng mô tả nhị phân, theo dòng, lược đồ nhúng, tiến hoá lược đồ → khoá là Avro. Hai câu, hai khoá, phân biệt bằng chính các đặc điểm được mô tả.

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

  • A (Apache Avro) — đây là phương án gần nhất vì Avro cũng lưu lược đồ dưới dạng JSON, nhưng bản thân dữ liệu Avro là NHỊ PHÂN, không mở ra thấy {} được.

  • C (Apache Parquet) — nhị phân, theo cột, hoàn toàn không đọc được bằng mắt.

  • D (CSV) — phẳng, không lồng nhau, ngăn cách bằng dấu phẩy và xuống dòng.

Ghi nhớ

⚠ Nhận dạng bốn định dạng — bảng phải thuộc: | Định dạng | Dấu hiệu | |---|---| | JSON | văn bản, {} và [], LỒNG NHAU được | | Avro | nhị phân, theo DÒNG, lược đồ nhúng | | Parquet | nhị phân, theo CỘT | | CSV | văn bản, PHẲNG, ngăn cách bằng dấu phẩy | | Đọc bằng mắt được | chỉ JSON và CSV |

Từ khoá nhận diện:

"khoá–giá trị, lồng nhau, {}" → JSON "nhị phân, theo dòng, tiến hoá lược đồ" → Avro "theo cột, nén tốt, phân tích" → Parquet "bảng phẳng đơn giản" → CSV "JSON cho BigQuery" → phải là NDJSON

JSON trong BigQuery — hai cách xử lý Cách
Trải thành STRUCT và ARRAY hiệu quả nhất, khai lược đồ tường minh
Kiểu JSON gốc giữ nguyên, truy cập bằng toán tử
Truy cập du_lieu.dia_chi.thanh_pho
Hàm JSON_VALUE, JSON_QUERY, JSON_EXTRACT
UNNEST trải mảng thành dòng
Chọn kiểu JSON khi lược đồ hay thay đổi, không đoán trước được
Ưu và nhược của JSON Nội dung
Ưu: đọc được bằng mắt dễ gỡ lỗi
Ưu: linh hoạt, lồng nhau hợp với API
Ưu: mọi ngôn ngữ đều hỗ trợ
Nhược: CỒNG KỀNH lặp tên khoá ở mọi bản ghi
Nhược: không có kiểu chặt số và chuỗi dễ lẫn
Nhược: phân tích chậm hơn nhị phân
Khi nào chuyển JSON sang định dạng khác Nội dung
Dữ liệu lớn cần phân tích → Parquet
Luồng sự kiện cần lược đồ chặt → Avro
Giữ JSON khi dữ liệu nhỏ, hoặc lược đồ rất động
Kích thước Parquet thường nhỏ hơn JSON nhiều lần
Chi phí truy vấn Parquet rẻ hơn hẳn trên BigQuery external table
Các biến thể hay gặp Biến thể
NDJSON / JSON Lines mỗi dòng một đối tượng — dạng BigQuery cần
JSON mảng lớn [{...},{...}] — phải chuyển đổi trước
JSONB kiểu nhị phân của PostgreSQL
GeoJSON dữ liệu địa lý
Chuyển đổi jq -c '.[]' biến mảng thành NDJSON

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Tệp có đúng NDJSON không | head -3 tep.json — mỗi dòng phải là một {...} | | JSON có hợp lệ không | jq . tep.json > /dev/null | | BigQuery hiểu lược đồ thế nào | bq show --schema sau khi nạp |

Và một lỗi rất hay gặp khi nạp JSON vào BigQuery lần đầu: tệp là một mảng lớn thay vì NDJSON. Trình nạp báo lỗi phân tích cú pháp ngay ở dòng đầu tiên, và thông báo nghe như tệp bị hỏng — trong khi thực ra tệp hoàn toàn hợp lệ, chỉ là ở dạng mà BigQuery không nhận.