Ngân hàng đề — Google Cloud Associate Data Practitioner
Tìm thấy 333 câu.
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?
- A Pub/Sub and Dataflow
- B Eventarc and Cloud Run
- C Cloud SQL and Cloud Functions
- 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.
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?
- A Project Editor
- B Storage Admin
- C Storage Object Admin
- 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.
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?
- A Data quality assessment
- B Data archiving
- C Data transformation
- 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".
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?
- A Cloud Composer
- B Cloud Functions
- C Using a custom Compute Engine startup script
- 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ó.
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?
- A Increase the instance's vCPU and RAM.
- B Enable automated backups.
- C Configure a cross-region read replica.
- 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.
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?
- A Browser
- B Viewer
- C Editor
- 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ó.
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?
- A BigQuery Data Viewer and BigQuery Job User
- B BigQuery Data Editor and BigQuery Job User
- C BigQuery Admin and Project Viewer
- 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
dataEditorcho 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.adminlà 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.usertrê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ỗ.
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?
- A ETL (Extract, Transform, Load)
- B ETLT (Extract, Transform, Load, Transform)
- C Reverse ETL
- 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ý.
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?
- A In the BigQuery UI, write a SQL query using LOAD DATA.
- B In the BigQuery UI, select the destination dataset, click 'Create Table', and choose 'Google Cloud Storage' as the source.
- C In the IAM UI, grant the BigQuery service account access to the file.
- 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 DATAthậ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.
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?
- A Apache Avro
- B JSON
- C Apache Parquet
- 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.