Ngân hàng đề — Google Cloud Professional Data Engineer
Tìm thấy 429 câu.
- A Define a separate row key for each group.
- B Put related columns in column family
- C Create secondary indexes that include all columns in a group. Create one secondary index for each group.
- D Put only one set of related columns in a table and use one table for each group
Xem giải thích
Đáp án
B — Đặt các cột liên quan vào cùng một column family.
Vì sao đúng
⚠ Cấu trúc lưu trữ của Bigtable:
⚠ Row key
├── ⚠ Column family "thong-tin"
│ ├── cột: ten, tuoi, dia-chi
└── ⚠ Column family "giao-dich"
├── cột: so-tien, ngay
↓
⚠ Mỗi column family được lưu
GẦN NHAU trên đĩa
↓
⚠ Đọc một family = ⚠ đọc ÍT dữ liệu hơn
⚠ nhanh hơn
⚠ Đọc được theo từng column family — ⚠ nhóm cột hay dùng chung vào một family thì ⚠ mỗi lần đọc không phải kéo theo cột không cần.
Vì sao các phương án khác sai
-
C (tạo secondary index cho mỗi nhóm cột) — ⚠ Bigtable KHÔNG có secondary index: ⚠ chỉ truy vấn bằng row key hoặc quét khoảng row key.
-
D (mỗi nhóm cột một bảng riêng) — ⚠ phá vỡ tính nguyên tử: ⚠ Bigtable chỉ đảm bảo nguyên tử trong một dòng; ⚠ tách bảng là mất điều đó và ⚠ phải đọc nhiều lần.
-
A (mỗi nhóm một row key riêng) — ⚠ nhân bản dữ liệu và làm hỏng thiết kế khoá: ⚠ row key là nền tảng của mọi truy vấn Bigtable.
Ghi nhớ
⚠ Bigtable — khái niệm phải thuộc: | Khái niệm | Nội dung | |---|---| | ⚠ Row key | ⚠ cách DUY NHẤT để truy vấn — thiết kế quan trọng nhất | | ⚠ Column family | ⚠ nhóm cột lưu gần nhau, khai TRƯỚC | | ⚠ Column qualifier | ⚠ tên cột, tạo động, không cần khai | | ⚠ Cell | ⚠ giá trị + dấu thời gian, có nhiều phiên bản | | ⚠ Số column family | ⚠ nên ÍT — dưới 100, lý tưởng là vài cái |
Từ khoá nhận diện:
"nhóm cột hay dùng chung" → ⚠ column family "truy vấn theo cột không phải khoá" → ⚠ Bigtable KHÔNG làm được — cần thiết kế lại row key "điểm nóng khi ghi" → ⚠ row key tuần tự — cần salting hoặc đảo trường
| ⚠ Thiết kế row key — nguyên tắc | Nguyên tắc |
|---|---|
| ⚠ TRÁNH khoá tăng dần | ⚠ dấu thời gian ở đầu = điểm nóng |
| ⚠ Ghép trường theo thứ tự truy vấn | ⚠ thiết bị#ngược-thời-gian |
| ⚠ Dùng dấu thời gian ĐẢO NGƯỢC nếu cần bản ghi mới nhất | |
| ⚠ Salting hoặc băm để rải đều | ⚠ nhưng mất khả năng quét theo khoảng |
| ⚠ Đánh đổi cốt lõi | ⚠ rải đều để ghi nhanh, giữ thứ tự để đọc theo khoảng |
| ⚠ Bigtable KHÔNG có gì | Không có |
|---|---|
| ⚠ Secondary index | |
| ⚠ JOIN | |
| ⚠ Giao dịch trên nhiều dòng | ⚠ chỉ nguyên tử trong MỘT dòng |
| ⚠ SQL đầy đủ | ⚠ có GoogleSQL cho Bigtable nhưng hạn chế |
| ⚠ Hệ quả | ⚠ mọi mẫu truy vấn phải được tính vào row key ngay từ đầu |
| ⚠ Khi nào chọn Bigtable | Khi nào |
|---|---|
| ⚠ Trên 1 TB dữ liệu | ⚠ dưới ngưỡng đó thường có lựa chọn rẻ hơn |
| ⚠ Cần độ trễ dưới 10 mili giây | |
| ⚠ Ghi và đọc với thông lượng rất cao | |
| ⚠ Chuỗi thời gian, IoT, dữ liệu tài chính, ads | |
| ⚠ KHÔNG chọn khi | ⚠ cần truy vấn linh hoạt hoặc phân tích ad-hoc — dùng BigQuery |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Row key có gây điểm nóng không | ⚠ Key Visualizer cho thấy ngay | | Số column family có quá nhiều không | | | Có đang cố truy vấn theo cột không phải khoá không | ⚠ dấu hiệu chọn nhầm CSDL |
Và điều quyết định thành bại của một hệ thống Bigtable: thiết kế row key. Nó phải được quyết ngay từ đầu dựa trên cách bạn sẽ đọc dữ liệu, và sửa nó về sau nghĩa là chép lại toàn bộ bảng.
To avoid hot-spotting in your Bigtable clusters, you have designed a row key that uses a UUID prefix. This is not working as expected and there is hot-spotting when writing data to Bigtable. What could be the cause of the hot-spotting?
-
A
The name of the row key column is too long.
-
B
Secondary indexes are slowing write operations.
-
C
You have chosen a type of UUID that has sequentially ordered strings.
-
D
You have incorrectly configured column families.
Xem giải thích
Đáp án
C — Bạn đã chọn loại UUID sinh ra chuỗi có thứ tự tuần tự.
Vì sao đúng
⚠ Không phải UUID nào cũng ngẫu nhiên.
| Loại UUID | Đặc điểm |
|---|---|
| ⚠ UUID v1 | ⚠ dựa trên DẤU THỜI GIAN + địa chỉ MAC — TUẦN TỰ |
| ⚠ UUID v4 | ⚠ NGẪU NHIÊN hoàn toàn — rải đều |
| ⚠ UUID v7 | ⚠ có tiền tố thời gian, cố ý sắp thứ tự |
⚠ UUID tuần tự làm tiền tố row key
↓
⚠ Các khoá liên tiếp GẦN NHAU
↓
⚠ Cùng rơi vào MỘT tablet
↓
⚠ ĐIỂM NÓNG vẫn xảy ra
⚠ dù đã "dùng UUID"
⚠ Cách sửa: ⚠ dùng UUID v4, ⚠ hoặc băm (hash) tiền tố để rải đều.
Vì sao các phương án khác sai
-
B (secondary index làm chậm việc ghi) — ⚠ Bigtable KHÔNG có secondary index: ⚠ phương án bịa.
-
D (cấu hình column family sai) — ⚠ column family ảnh hưởng hiệu năng ĐỌC: ⚠ không gây điểm nóng khi ghi.
-
A (tên cột row key quá dài) — ⚠ row key không có "tên cột": ⚠ độ dài khoá ảnh hưởng dung lượng, ⚠ không phải phân bố.
Ghi nhớ
⚠ Điểm nóng (hotspotting) trong Bigtable — bảng phải thuộc: | Nguyên nhân | Ví dụ | |---|---| | ⚠ Dấu thời gian ở ĐẦU khoá | ⚠ mọi ghi mới đổ vào một tablet | | ⚠ ID tăng dần | ⚠ auto-increment | | ⚠ UUID tuần tự (v1, v7) | ⚠ đề này | | ⚠ Giá trị lệch nặng | ⚠ 90% dữ liệu cùng một tiền tố |
Từ khoá nhận diện:
"điểm nóng khi ghi" → ⚠ row key tuần tự "đã dùng UUID mà vẫn nóng" → ⚠ UUID loại có thứ tự "xem phân bố tải theo khoá" → ⚠ Key Visualizer
| ⚠ Kỹ thuật rải đều khoá | Kỹ thuật |
|---|---|
| ⚠ Salting | ⚠ thêm tiền tố hash(khoá) % N |
| ⚠ Đảo thứ tự trường | ⚠ thiết-bị#thời-gian thay vì thời-gian#thiết-bị |
| ⚠ Dấu thời gian đảo ngược | ⚠ Long.MAX - timestamp — mới nhất lên đầu |
| ⚠ Băm toàn bộ khoá | ⚠ rải tốt nhất nhưng MẤT khả năng quét theo khoảng |
| ⚠ Đánh đổi luôn tồn tại | ⚠ rải đều ↔ quét theo khoảng |
| ⚠ Key Visualizer cho thấy gì | Nội dung |
|---|---|
| ⚠ Bản đồ nhiệt theo row key và thời gian | |
| ⚠ Vệt sáng dọc = điểm nóng | |
| ⚠ Phân bố đọc và ghi riêng biệt | |
| ⚠ Dùng khi nào | ⚠ trước khi đoán, hãy nhìn |
| ⚠ Bigtable tự chia tablet thế nào | Cơ chế |
|---|---|
| ⚠ Bảng được chia thành tablet theo KHOẢNG row key | |
| ⚠ Mỗi tablet do MỘT node phục vụ | |
| ⚠ Bigtable tự cân bằng lại theo tải | ⚠ nhưng cần thời gian |
| ⚠ Khoá tuần tự | ⚠ luôn dồn vào tablet CUỐI — cân bằng lại không kịp |
| ⚠ Có thể khai trước | ⚠ pre-split khi biết phân bố khoá |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Row key thật sự phân bố thế nào | ⚠ Key Visualizer | | UUID đang dùng là phiên bản mấy | ⚠ v4 mới ngẫu nhiên | | Có cần quét theo khoảng không | ⚠ quyết định được phép băm hay không |
Và bài học đắt nhất từ câu này: "dùng UUID" không phải một giải pháp, mà là một câu chưa đầy đủ. Phiên bản của UUID mới là thứ quyết định dữ liệu có rải đều hay không.
A new workload has been deployed to Cloud Dataproc, which is configured with an autoscaling policy. You are noticing a FetchFailedException is occurring intermittently. What would be the most likely cause of this problem?
-
A
You are using a GCS bucket with improper access controls.
-
B
The autoscaling policy is scaling down and shuffle data is lost when a node is decommissioned.
-
C
The autoscaling policy is adding nodes too fast and data is being dropped.
-
D
You are using Google Cloud Storage instead of local storage for persistent storage.
Xem giải thích
Đáp án
B — Chính sách autoscaling đang thu nhỏ cụm, và dữ liệu shuffle bị mất khi một node bị gỡ khỏi cụm.
Vì sao đúng
⚠ Shuffle là gì và vì sao nó dễ vỡ:
⚠ Spark chạy một stage
↓
⚠ Ghi dữ liệu SHUFFLE ra ĐĨA CỤC BỘ
của từng worker
↓
⚠ Stage sau ĐỌC dữ liệu shuffle đó
từ các worker khác
↓ ⚠ Autoscaling GỠ một worker
⚠ Dữ liệu shuffle trên node đó BIẾN MẤT
↓
⚠ FetchFailedException
⚠ Đúng đặc điểm "không thường xuyên" (intermittently) trong đề — ⚠ chỉ xảy ra khi cụm co lại đúng lúc có shuffle đang dở.
Vì sao các phương án khác sai
-
C (autoscaling thêm node quá nhanh làm mất dữ liệu) — ⚠ THÊM node không làm mất gì: ⚠ node mới chỉ nhận việc mới.
-
A (bucket GCS phân quyền sai) — ⚠ sẽ gây lỗi quyền truy cập, ⚠ không phải
FetchFailedException, ⚠ và ⚠ sẽ xảy ra nhất quán chứ không lúc có lúc không. -
D (dùng Cloud Storage thay vì lưu trữ cục bộ) — ⚠ dùng GCS là THỰC HÀNH TỐT cho Dataproc: ⚠ nó không gây lỗi này; ⚠ shuffle vẫn dùng đĩa cục bộ dù dữ liệu nằm ở GCS.
Ghi nhớ
⚠ Autoscaling Dataproc — bảng phải thuộc: | Thiết lập | Ý nghĩa | |---|---| | ⚠ gracefulDecommissionTimeout | ⚠ chờ node hoàn thành việc trước khi gỡ — THUỐC CHỮA chính | | ⚠ scaleDownFactor | ⚠ thu nhỏ nhanh hay chậm — đặt thấp hoặc 0 | | ⚠ cooldownPeriod | ⚠ khoảng nghỉ giữa hai lần co giãn | | ⚠ Secondary worker (preemptible) | ⚠ chỉ tính toán, KHÔNG lưu HDFS — an toàn hơn khi gỡ |
Từ khoá nhận diện:
"FetchFailedException lúc có lúc không" → ⚠ autoscaling thu nhỏ trong lúc shuffle "job chết khi dùng preemptible" → ⚠ VM bị thu hồi giữa chừng "tránh mất dữ liệu shuffle" → ⚠ Enhanced Flexibility Mode (EFM)
| ⚠ Ba cách chữa lỗi này | Cách |
|---|---|
| ⚠ Bật Enhanced Flexibility Mode (EFM) | ⚠ shuffle lưu ở primary worker, gỡ secondary an toàn |
| ⚠ Đặt gracefulDecommissionTimeout đủ dài | |
| ⚠ Giảm hoặc tắt scale-down trong giờ chạy job nặng | |
| ⚠ Cách gốc rễ | ⚠ EFM sinh ra chính xác cho vấn đề này |
| ⚠ Kiến trúc Dataproc nên theo | Kiến trúc |
|---|---|
| ⚠ Cụm NGẮN HẠN: tạo → chạy job → xoá | ⚠ không trả tiền cho cụm rảnh |
| ⚠ Dữ liệu ở Cloud Storage, KHÔNG ở HDFS | ⚠ tách lưu trữ khỏi tính toán |
| ⚠ Primary worker ổn định + secondary preemptible | ⚠ giảm chi phí tới 80% |
| ⚠ Initialization action để cài thêm phần mềm | |
| ⚠ Lợi ích của tách rời | ⚠ xoá cụm không mất dữ liệu |
| ⚠ Primary so với Secondary worker | So sánh |
|---|---|
| ⚠ Primary: chạy HDFS DataNode, ổn định | |
| ⚠ Secondary: chỉ tính toán, không lưu HDFS | |
| ⚠ Secondary có thể là preemptible hoặc Spot | ⚠ rẻ, có thể bị thu hồi |
| ⚠ Autoscaling | ⚠ nên co giãn ở secondary, giữ primary ổn định |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Lỗi xảy ra có trùng lúc cụm co lại không | ⚠ đối chiếu log autoscaling | | EFM đã bật chưa | | | gracefulDecommissionTimeout đặt bao nhiêu | ⚠ 0 nghĩa là gỡ ngay lập tức |
Và nguồn gốc của cả lớp lỗi này: Spark giả định worker còn sống cho tới hết job, còn autoscaling thì giả định gỡ một worker rảnh là vô hại. Hai giả định đó gặp nhau đúng lúc shuffle đang dở dang.
- A Cloud Firestore
- B Cloud Spanner
- C BigQuery
- D Bigtable
Xem giải thích
Đáp án
D — Bigtable.
Vì sao đúng
⚠ Ba manh mối trong đề, cả ba đều chỉ về Bigtable: | Manh mối | Vì sao là Bigtable | |---|---| | ⚠ Từng dùng Hadoop HBase | ⚠ Bigtable dùng CHÍNH API của HBase | | ⚠ Ghi khối lượng lớn, độ trễ thấp | ⚠ đúng thế mạnh của Bigtable | | ⚠ IoT, dữ liệu cảm biến | ⚠ ca dùng kinh điển — chuỗi thời gian |
⚠ Điểm quyết định: ⚠ Bigtable tương thích API HBase — ⚠ mã HBase hiện có ⚠ di trú với thay đổi tối thiểu.
Vì sao các phương án khác sai
-
A (Cloud Firestore) — ⚠ CSDL tài liệu cho ứng dụng web/di động: ⚠ không thiết kế cho thông lượng ghi cực cao của IoT.
-
B (Cloud Spanner) — ⚠ CSDL quan hệ toàn cầu, nhất quán mạnh: ⚠ mạnh nhưng ⚠ đắt hơn nhiều và ⚠ không cần thiết cho dữ liệu cảm biến.
-
C (BigQuery) — ⚠ kho PHÂN TÍCH, không phải CSDL vận hành: ⚠ độ trễ truy vấn tính bằng giây, ⚠ không hợp với ghi từng bản ghi độ trễ thấp; ⚠ nhưng ⚠ thường là đích cuối để phân tích sau khi dữ liệu qua Bigtable.
Ghi nhớ
⚠ Ánh xạ hệ sinh thái Hadoop sang Google Cloud — bảng phải thuộc: | Hadoop | Google Cloud | |---|---| | ⚠ HBase | ⚠ Bigtable | | ⚠ HDFS | ⚠ Cloud Storage | | ⚠ Hive | ⚠ BigQuery | | ⚠ Spark, MapReduce | ⚠ Dataproc hoặc Dataflow | | ⚠ Kafka | ⚠ Pub/Sub | | ⚠ Oozie / Airflow | ⚠ Cloud Composer |
Từ khoá nhận diện:
"di trú từ HBase" → ⚠ Bigtable "di trú Hive" → ⚠ BigQuery "di trú Kafka" → ⚠ Pub/Sub "giữ nguyên cụm Spark/Hadoop" → ⚠ Dataproc
| ⚠ Kiến trúc IoT điển hình trên Google Cloud | Chuỗi |
|---|---|
| ⚠ Thiết bị → Pub/Sub | ⚠ thu nhận, đệm |
| ⚠ Pub/Sub → Dataflow | ⚠ xử lý luồng, làm sạch, tổng hợp |
| ⚠ Dataflow → Bigtable | ⚠ truy vấn thời gian thực độ trễ thấp |
| ⚠ Dataflow → BigQuery | ⚠ phân tích lịch sử |
| ⚠ Hai đích song song | ⚠ mỗi cái phục vụ một loại câu hỏi |
| ⚠ Bigtable — con số phải nhớ | Con số |
|---|---|
| ⚠ Độ trễ đọc/ghi | ⚠ dưới 10 mili giây |
| ⚠ Quy mô | ⚠ hàng petabyte |
| ⚠ Ngưỡng đáng dùng | ⚠ từ khoảng 1 TB trở lên |
| ⚠ Co giãn | ⚠ thêm node là tăng thông lượng gần tuyến tính |
| ⚠ Chi phí | ⚠ trả theo NODE, không theo lượng truy vấn — cụm rảnh vẫn tốn tiền |
| ⚠ Nhân bản Bigtable | Nhân bản |
|---|---|
| ⚠ Nhiều cụm trong một instance | |
| ⚠ Nhất quán CUỐI CÙNG giữa các cụm | |
| ⚠ Dùng app profile để định tuyến lưu lượng | |
| ⚠ Ca dùng | ⚠ tách tải phân tích khỏi tải phục vụ, hoặc dự phòng theo vùng |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Dữ liệu có thật sự trên 1 TB không | ⚠ dưới ngưỡng có lựa chọn rẻ hơn | | Mọi truy vấn có đi qua row key được không | | | Cụm có bị rảnh nhiều không | ⚠ vẫn tính tiền theo node |
Và điều khiến việc di trú từ HBase sang Bigtable dễ hơn mọi lựa chọn khác: cùng một API. Phần khó không nằm ở mã, mà ở chỗ thiết kế row key cũ có còn hợp với cách Bigtable chia tablet hay không.
- A fixed windows (also called tumbling windows)
- B session windows
- C concurrent windows
- D sliding window (also called hopping windows)
Xem giải thích
Đáp án
D — Sliding window (còn gọi là hopping window).
Vì sao đúng
⚠ Yêu cầu của đề: ⚠ phân tích nhiệt độ của MỘT GIỜ VỪA QUA, ⚠ liên tục, ⚠ để phát cảnh báo.
⚠ Sliding window: cửa sổ dài 1 giờ
⚠ trượt mỗi 1 phút
↓
09:00–10:00 → ⚠ tính trung bình, độ lệch chuẩn
09:01–10:01 → ⚠ tính lại
09:02–10:02 → ⚠ tính lại
↓
⚠ LUÔN có kết quả cho "một giờ qua"
⚠ Nếu dùng fixed window thì sao: | Vấn đề | Hậu quả | |---|---| | ⚠ Cửa sổ 09:00–10:00 rồi 10:00–11:00 | ⚠ không chồng lấn | | ⚠ Lúc 10:05 chỉ có 5 phút dữ liệu | ⚠ không phải "một giờ qua" | | ⚠ Cảnh báo chỉ đến mỗi giờ một lần | ⚠ quá chậm |
Vì sao các phương án khác sai
-
A (fixed / tumbling window) — ⚠ các cửa sổ KHÔNG chồng lấn: ⚠ hợp cho báo cáo theo giờ, ⚠ không hợp cho "một giờ trượt vừa qua".
-
B (session window) — ⚠ nhóm sự kiện theo khoảng NGHỈ giữa chúng: ⚠ dùng cho hành vi người dùng (phiên truy cập), ⚠ không phải chuỗi cảm biến liên tục.
-
C (concurrent window) — ⚠ KHÔNG tồn tại trong Apache Beam: ⚠ phương án bịa.
Ghi nhớ
⚠ Các loại cửa sổ trong Apache Beam — bảng phải thuộc: | Loại | Đặc điểm | Dùng cho | |---|---|---| | ⚠ Fixed (tumbling) | ⚠ không chồng lấn, độ dài cố định | ⚠ báo cáo theo giờ/ngày | | ⚠ Sliding (hopping) | ⚠ CHỒNG LẤN, có độ dài và bước trượt | ⚠ trung bình trượt, cảnh báo — đề này | | ⚠ Session | ⚠ theo khoảng nghỉ, độ dài thay đổi | ⚠ phiên người dùng | | ⚠ Global | ⚠ một cửa sổ duy nhất | ⚠ batch, hoặc dùng với trigger tuỳ chỉnh |
Từ khoá nhận diện:
"N phút/giờ VỪA QUA, cập nhật liên tục" → ⚠ sliding window "tổng theo từng giờ" → ⚠ fixed window "gom hoạt động của một người dùng" → ⚠ session window "dữ liệu tới muộn" → ⚠ watermark và trigger, không phải loại cửa sổ
| ⚠ Sliding window — hai tham số | Tham số |
|---|---|
| ⚠ Độ dài cửa sổ (size) | ⚠ một giờ trong đề này |
| ⚠ Bước trượt (period) | ⚠ cách bao lâu tạo cửa sổ mới |
| ⚠ Hệ quả | ⚠ mỗi phần tử thuộc size/period cửa sổ |
| ⚠ Chi phí | ⚠ bước trượt càng nhỏ, khối lượng tính càng lớn |
| ⚠ Thời gian sự kiện so với thời gian xử lý | So sánh |
|---|---|
| ⚠ Event time | ⚠ lúc sự kiện THẬT SỰ xảy ra — Beam mặc định dùng |
| ⚠ Processing time | ⚠ lúc hệ thống nhận được |
| ⚠ Vì sao khác nhau | ⚠ mạng chậm, thiết bị mất kết nối rồi gửi bù |
| ⚠ Watermark | ⚠ ước lượng "đã nhận đủ dữ liệu tới mốc thời gian này" |
| ⚠ Xử lý dữ liệu tới muộn | Cách |
|---|---|
| ⚠ Allowed lateness | ⚠ chấp nhận muộn tới bao lâu |
| ⚠ Trigger | ⚠ khi nào phát kết quả — sớm, đúng lúc, hay muộn |
| ⚠ Accumulation mode | ⚠ cộng dồn hay thay thế kết quả cũ |
| ⚠ Với hệ thống cảnh báo | ⚠ thường phát sớm rồi hiệu chỉnh sau |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bước trượt có quá nhỏ không | ⚠ tốn tài nguyên theo cấp số | | Dữ liệu cảm biến tới muộn bao nhiêu | ⚠ quyết định allowed lateness | | Dùng event time hay processing time | ⚠ với IoT gần như luôn là event time |
Và điều khiến xử lý luồng khó hơn xử lý theo lô: dữ liệu không đến theo thứ tự nó xảy ra. Mọi khái niệm cửa sổ, watermark và trigger đều sinh ra để trả lời một câu hỏi duy nhất — chờ đến bao giờ thì coi là đủ.
- A Vertex AI AutoML training
- B Cloud TPUs
- C BigQuery ML
- D Vertex AI custom training
Xem giải thích
Đáp án
D — Vertex AI custom training (huấn luyện tuỳ chỉnh).
Vì sao đúng
⚠ Đề có hai yêu cầu tưởng như mâu thuẫn: | Yêu cầu | Cách giải | |---|---| | ⚠ Muốn dùng dịch vụ ĐƯỢC QUẢN | ⚠ Vertex AI lo hạ tầng, co giãn, theo dõi | | ⚠ Muốn TỰ tinh chỉnh siêu tham số | ⚠ custom training cho toàn quyền với mã huấn luyện |
⚠ Bạn viết mã huấn luyện
(⚠ TensorFlow, PyTorch, scikit-learn)
↓
⚠ Vertex AI chạy trên hạ tầng được quản
↓
⚠ BẠN quyết siêu tham số
⚠ hoặc dùng Vertex AI Vizier
để dò tự động
Vì sao các phương án khác sai
-
A (Vertex AI AutoML) — ⚠ bẫy gần nhất, khác đúng điểm đề nhấn: ⚠ AutoML tự chọn kiến trúc và siêu tham số; ⚠ đó chính là thứ ⚠ đội này KHÔNG muốn — họ muốn tự tinh chỉnh.
-
C (BigQuery ML) — ⚠ rất tiện nhưng ít tuỳ biến: ⚠ huấn luyện bằng SQL, ⚠ chỉ chỉnh được một số tuỳ chọn giới hạn.
-
B (Cloud TPU) — ⚠ là PHẦN CỨNG, không phải dịch vụ ML được quản: ⚠ dùng TPU vẫn phải có nơi chạy mã.
Ghi nhớ
⚠ Thang tuỳ biến của các dịch vụ ML Google Cloud — bảng phải thuộc: | Dịch vụ | Tuỳ biến | Công sức | |---|---|---| | ⚠ API dựng sẵn (Vision, NL, Speech) | ⚠ không có | ⚠ thấp nhất | | ⚠ AutoML | ⚠ chỉ chọn dữ liệu và mục tiêu | ⚠ thấp | | ⚠ BigQuery ML | ⚠ vừa phải, SQL | ⚠ thấp | | ⚠ Vertex AI custom training | ⚠ TOÀN QUYỀN — đề này | ⚠ cao | | ⚠ Tự dựng trên GKE/GCE | ⚠ toàn quyền tuyệt đối | ⚠ cao nhất |
Từ khoá nhận diện:
"tự tinh chỉnh siêu tham số" → ⚠ Vertex AI custom training "không có chuyên gia ML, muốn nhanh" → ⚠ AutoML "nhà phân tích biết SQL, dữ liệu đã ở BigQuery" → ⚠ BigQuery ML "bài toán phổ biến, không cần huấn luyện" → ⚠ API dựng sẵn
| ⚠ Vertex AI Vizier / hyperparameter tuning | Đặc điểm |
|---|---|
| ⚠ Dò siêu tham số tự động | ⚠ tối ưu Bayes, không phải thử hết |
| ⚠ Chạy nhiều trial song song | |
| ⚠ Khai không gian tìm kiếm và chỉ số mục tiêu | |
| ⚠ Kết hợp | ⚠ custom training + tuning = vừa toàn quyền vừa tự động |
| ⚠ BigQuery ML — biết để phân biệt | Đặc điểm |
|---|---|
⚠ Huấn luyện bằng CREATE MODEL |
|
| ⚠ Dữ liệu không phải rời khỏi BigQuery | ⚠ ưu điểm lớn nhất |
| ⚠ Hỗ trợ hồi quy, phân loại, phân cụm, dự báo, ma trận | |
| ⚠ Nhập được mô hình TensorFlow | |
| ⚠ Hạn chế | ⚠ ít kiểm soát chi tiết quá trình huấn luyện |
| ⚠ Thành phần của Vertex AI cần biết | Thành phần |
|---|---|
| ⚠ Training | ⚠ AutoML hoặc custom |
| ⚠ Prediction | ⚠ endpoint trực tuyến hoặc batch |
| ⚠ Feature Store | ⚠ quản đặc trưng dùng chung |
| ⚠ Pipelines | ⚠ tự động hoá quy trình MLOps |
| ⚠ Model Monitoring | ⚠ phát hiện trôi dữ liệu và trôi dự đoán |
| ⚠ Workbench | ⚠ notebook được quản |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Đội có thật sự cần tuỳ biến sâu không | ⚠ AutoML thường đủ tốt và rẻ hơn nhiều | | Đã đo baseline bằng AutoML chưa | ⚠ để biết mô hình tự viết có hơn không | | Có kế hoạch theo dõi mô hình sau khi triển khai không | |
Và bước hay bị bỏ qua nhất trong dự án ML: dựng một baseline đơn giản trước. Nếu AutoML đạt 92% trong một buổi chiều, thì mô hình tự viết mất ba tuần cần phải đạt hơn thế mới đáng.
You have created a function that should run whenever a message is written to a Cloud Pub/Sub topic. What command would you use to deploy that function?
- A gcloud pubsub subscription publish
- B gcloud pubsub topics publish
- C gcloud pubsub topics pull
- D gcloud functions deploy
Xem giải thích
Đáp án
D — gcloud functions deploy.
Vì sao đúng
⚠ Đề hỏi lệnh để TRIỂN KHAI hàm — ⚠ không phải lệnh để gửi hay đọc tin nhắn.
gcloud functions deploy TEN_HAM \
--trigger-topic=TEN_TOPIC \
--runtime=python312 \
--entry-point=ham_xu_ly
⚠ Phân biệt rõ ba nhóm lệnh: | Việc | Lệnh | |---|---| | ⚠ Triển khai hàm | ⚠ gcloud functions deploy — đề này | | ⚠ Gửi tin nhắn | ⚠ gcloud pubsub topics publish | | ⚠ Đọc tin nhắn | ⚠ gcloud pubsub subscriptions pull |
Vì sao các phương án khác sai
-
B (
gcloud pubsub topics publish) — ⚠ GỬI một tin nhắn vào topic: ⚠ dùng để thử, ⚠ không triển khai gì. -
C (
gcloud pubsub topics pull) — ⚠ sai cấp tài nguyên: ⚠pullthuộc về subscriptions, không phải topics. -
A (
gcloud pubsub subscription publish) — ⚠ sai cả hai vế: ⚠ publish là của topic, ⚠ và ⚠ nhóm lệnh viết đúng làsubscriptions(số nhiều).
Ghi nhớ
⚠ Cấu trúc lệnh gcloud — quy tắc phải thuộc:
gcloud <NHÓM> <TÀI NGUYÊN số nhiều> <ĐỘNG TỪ>
↓
gcloud pubsub topics create
gcloud pubsub subscriptions pull
gcloud functions deploy
gcloud dataproc clusters create
⚠ Tài nguyên gần như luôn ở dạng SỐ NHIỀU.
Từ khoá nhận diện:
"triển khai hàm" → ⚠
gcloud functions deploy"gửi tin nhắn thử" → ⚠gcloud pubsub topics publish"đọc tin nhắn thử" → ⚠gcloud pubsub subscriptions pull"xem log của hàm" → ⚠gcloud functions logs read
| ⚠ Các loại trigger của Cloud Functions | Trigger |
|---|---|
⚠ --trigger-topic |
⚠ Pub/Sub — đề này |
⚠ --trigger-http |
⚠ gọi qua HTTP |
⚠ --trigger-bucket |
⚠ Cloud Storage: tệp được tạo, xoá, sửa |
⚠ --trigger-event-filters |
⚠ Eventarc: nhiều nguồn sự kiện |
| ⚠ Cloud Functions thế hệ 2 | ⚠ chạy trên nền Cloud Run, dùng Eventarc |
| ⚠ Điều phải nhớ khi viết hàm nghe Pub/Sub | Điều |
|---|---|
| ⚠ Tin nhắn có thể được giao NHIỀU LẦN | ⚠ hàm phải chịu được lặp (idempotent) |
| ⚠ Nội dung được mã hoá base64 | ⚠ phải giải mã |
| ⚠ Hàm trả lỗi = tin nhắn được giao lại | |
| ⚠ Cần dead-letter topic cho tin lỗi vĩnh viễn | ⚠ tránh vòng lặp vô hạn |
| ⚠ Đặt timeout đủ dài cho xử lý |
| ⚠ Khi nào dùng Cloud Functions, khi nào dùng Dataflow | So sánh |
|---|---|
| ⚠ Functions: xử lý từng sự kiện độc lập | ⚠ đơn giản, nhẹ |
| ⚠ Dataflow: cần cửa sổ, tổng hợp, join, trạng thái | |
| ⚠ Functions: khối lượng vừa phải | |
| ⚠ Dataflow: thông lượng rất cao, xử lý phức tạp |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Hàm có chịu được tin nhắn lặp không | | | Đã cấu hình dead-letter topic chưa | | | Timeout của hàm có đủ cho xử lý chậm nhất không | |
Và lỗi phổ biến nhất khi nối Cloud Functions với Pub/Sub: quên rằng tin nhắn có thể tới hai lần. Một hàm ghi thêm dòng vào cơ sở dữ liệu mà không kiểm tra trùng sẽ âm thầm nhân đôi dữ liệu, và không có lỗi nào hiện ra.
In order to comply with industry regulations, you will need to use customer managed keys when analyzing data using Cloud Dataproc. You will be managing Cloud Dataproc clusters using command line tools. What command would you use with the --gce-pd-kms-key parameter to specify a Cloud KMS resource ID to use with the cluster?
- A gcloud clusters dataproc create
- B gcloud clusters dataproc kms
-
C
gcloud dataproc clusters create
- D gcloud dataproc clusters kms
Xem giải thích
Đáp án
C — gcloud dataproc clusters create.
Vì sao đúng
⚠ Quy tắc đặt tên lệnh gcloud:
gcloud <DỊCH VỤ> <TÀI NGUYÊN> <ĐỘNG TỪ>
↓
gcloud dataproc clusters create
⚠ dịch vụ: dataproc
⚠ tài nguyên: clusters (SỐ NHIỀU)
⚠ động từ: create
⚠ Lệnh đầy đủ với CMEK:
gcloud dataproc clusters create ten-cum \
--region=asia-southeast1 \
--gce-pd-kms-key=projects/P/locations/L/keyRings/R/cryptoKeys/K
Vì sao các phương án khác sai
-
A (
gcloud clusters dataproc create) — ⚠ đảo ngược thứ tự: ⚠ dịch vụ phải đứng trước tài nguyên. -
B (
gcloud clusters dataproc kms) — ⚠ sai thứ tự VÀ sai động từ: ⚠kmskhông phải động từ. -
D (
gcloud dataproc clusters kms) — ⚠ thứ tự đúng nhưng động từ sai: ⚠ KMS được khai bằng cờ--gce-pd-kms-key, ⚠ không phải một lệnh con.
Ghi nhớ
⚠ Mẫu lệnh gcloud — bảng phải thuộc: | Lệnh | Việc | |---|---| | ⚠ gcloud dataproc clusters create | ⚠ tạo cụm Dataproc | | ⚠ gcloud dataproc jobs submit spark | ⚠ gửi job Spark | | ⚠ gcloud compute instances create | ⚠ tạo VM | | ⚠ gcloud kms keys create | ⚠ tạo khoá | | ⚠ Quy luật chung | ⚠ dịch vụ → tài nguyên số nhiều → động từ |
Từ khoá nhận diện:
"tạo cụm Dataproc với CMEK" → ⚠
--gce-pd-kms-key"tạo cụm với sole-tenant" → ⚠--node-group"cụm tự xoá sau khi rảnh" → ⚠--max-idle
⚠ Cờ hay dùng của dataproc clusters create |
Cờ |
|---|---|
⚠ --region |
⚠ bắt buộc |
⚠ --gce-pd-kms-key |
⚠ CMEK cho đĩa — đề này |
⚠ --max-idle |
⚠ tự xoá cụm khi rảnh — TIẾT KIỆM nhiều nhất |
⚠ --num-secondary-workers |
⚠ worker preemptible |
⚠ --enable-component-gateway |
⚠ truy cập giao diện web của Spark/YARN |
⚠ --initialization-actions |
⚠ script cài thêm phần mềm |
⚠ --autoscaling-policy |
| ⚠ CMEK cho Dataproc bảo vệ gì | Bảo vệ |
|---|---|
| ⚠ Đĩa khởi động và đĩa dữ liệu của VM trong cụm | |
| ⚠ Cần cấp quyền dùng khoá cho service agent | ⚠ thiếu là cụm không tạo được |
| ⚠ Khoá phải cùng vùng với cụm | |
| ⚠ KHÔNG tự động bảo vệ | ⚠ dữ liệu ở Cloud Storage — bucket cần CMEK riêng |
| ⚠ Mẹo dùng gcloud hiệu quả | Mẹo |
|---|---|
⚠ gcloud <lệnh> --help |
⚠ danh sách cờ đầy đủ |
⚠ --dry-run hoặc --log-http |
⚠ xem trước, gỡ lỗi |
⚠ --format=json và --filter |
⚠ lọc kết quả để dùng trong script |
⚠ gcloud config set |
⚠ đặt project và vùng mặc định |
| ⚠ Trong đề thi | ⚠ lệnh sai thứ tự nhóm là bẫy phổ biến nhất |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Service agent đã có quyền dùng khoá chưa | | | Cụm có bật --max-idle không | ⚠ cụm quên xoá là khoản lãng phí lớn nhất | | Khoá có cùng vùng với cụm không | |
Và khoản chi phí lãng phí phổ biến nhất với Dataproc: cụm được tạo ra để chạy một job rồi không ai xoá. Một cờ --max-idle duy nhất giải quyết được cả vấn đề đó.
A financial services company wants to use BigQuery for data warehousing and analytics. The company is required to ensure encryption keys are stored and managed in a key management system that’s deployed outside of a public cloud. They want to minimize the management overhead of key management while remaining in compliance. What would you recommend they do?
- A Use Cloud EKM for external key management
- B Use external data sources with BigQuery and encrypt the external data sources outside of Google Cloud
- C Use Data Catalog for external data management, specifically keys
- D Use Dataproc for external data management, specifically keys
Xem giải thích
Đáp án
A — Dùng Cloud EKM (External Key Manager) để quản lý khoá bên ngoài.
Vì sao đúng
⚠ Yêu cầu của đề: ⚠ khoá phải nằm trong hệ thống quản khoá TRIỂN KHAI NGOÀI đám mây công cộng, ⚠ mà vẫn giảm gánh nặng quản trị.
⚠ Cloud EKM
↓
⚠ Khoá nằm ở nhà cung cấp BÊN NGOÀI
(⚠ Thales, Fortanix, Equinix…)
↓
⚠ BigQuery gọi qua Cloud KMS
→ ⚠ EKM → ⚠ hệ thống ngoài
↓
⚠ Google KHÔNG BAO GIỜ thấy
khoá gốc
↓
⚠ Vẫn dùng BigQuery như bình thường
⚠ Vì sao "giảm gánh nặng quản trị": ⚠ EKM tích hợp sẵn với các dịch vụ Google Cloud; ⚠ không phải tự dựng lớp mã hoá nào.
Vì sao các phương án khác sai
-
B (dùng external data source và tự mã hoá bên ngoài Google Cloud) — ⚠ gánh nặng quản trị RẤT LỚN: ⚠ phải tự mã hoá, tự giải mã, ⚠ và ⚠ mất hầu hết khả năng truy vấn của BigQuery.
-
C (dùng Data Catalog để quản khoá) — ⚠ Data Catalog là công cụ SIÊU DỮ LIỆU: ⚠ mô tả dữ liệu ở đâu, nghĩa là gì; ⚠ không quản khoá.
-
D (dùng Dataproc để quản khoá) — ⚠ Dataproc là dịch vụ xử lý Spark/Hadoop: ⚠ hoàn toàn không liên quan.
Ghi nhớ
⚠ Bốn mức kiểm soát khoá — bảng phải thuộc: | Mức | Khoá nằm ở | |---|---| | ⚠ Google-managed (mặc định) | ⚠ Google, tự động, miễn phí | | ⚠ CMEK | ⚠ Cloud KMS, khách quản | | ⚠ Cloud HSM | ⚠ phần cứng chuyên dụng của Google, FIPS 140-2 Level 3 | | ⚠ Cloud EKM | ⚠ NGOÀI Google Cloud hoàn toàn — đề này |
Từ khoá nhận diện:
"khoá phải ở ngoài đám mây công cộng" → ⚠ Cloud EKM "khoá trong phần cứng đạt FIPS" → ⚠ Cloud HSM "khách tự quản khoá trong Google Cloud" → ⚠ CMEK "Google không được truy cập dữ liệu khi đang xử lý" → ⚠ Confidential Computing
| ⚠ Cloud EKM — điều phải nhớ | Điều |
|---|---|
| ⚠ Khoá KHÔNG BAO GIỜ rời khỏi hệ thống bên ngoài | |
| ⚠ Google gọi ra ngoài mỗi lần cần mã/giải mã | |
| ⚠ Hệ thống ngoài KHÔNG phản hồi = dữ liệu KHÔNG đọc được | ⚠ rủi ro sẵn sàng |
| ⚠ Thêm độ trễ cho mỗi thao tác khoá | |
| ⚠ Rút quyền ở hệ thống ngoài = cắt truy cập ngay | ⚠ "key justification" cho biết vì sao Google xin dùng khoá |
| ⚠ Đánh đổi khi chọn EKM | Đánh đổi |
|---|---|
| ⚠ Được: kiểm soát tối đa, chứng minh được với kiểm toán viên | |
| ⚠ Mất: độ sẵn sàng phụ thuộc bên thứ ba | |
| ⚠ Mất: độ trễ cao hơn | |
| ⚠ Mất: chi phí cao hơn | |
| ⚠ Chỉ chọn khi | ⚠ quy định BẮT BUỘC, không phải vì cảm giác an toàn hơn |
| ⚠ CMEK trong BigQuery | Chi tiết |
|---|---|
| ⚠ Đặt ở mức dataset hoặc từng bảng | |
| ⚠ Khoá phải cùng vùng với dataset | |
| ⚠ Kết quả truy vấn cũng được mã hoá bằng khoá đó | |
| ⚠ Nhớ | ⚠ mọi dữ liệu ở Google Cloud ĐÃ được mã hoá mặc định — CMEK chỉ thêm quyền kiểm soát |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Quy định có thật sự đòi khoá ngoài không | ⚠ hay CMEK là đủ | | Hệ thống EKM có SLA sẵn sàng bao nhiêu | ⚠ nó thành điểm hỏng đơn của bạn | | Có kế hoạch cho tình huống EKM không phản hồi không | |
Và điều cần nói rõ với bất kỳ ai đề xuất EKM: bạn đang đánh đổi độ sẵn sàng lấy quyền kiểm soát. Khi hệ thống khoá bên ngoài ngừng trả lời, dữ liệu của bạn vẫn nằm nguyên đó — chỉ là không ai đọc được nữa.
- A Install GPU drivers
- B Use Pytorch instead of Tensorflow
- C Use a Deep Learning VM image
- D Grant the Owner basic role to the VM service account
- E Update Python 3 on the VM
Xem giải thích
Đáp án
A và C — Cài driver GPU, và dùng Deep Learning VM image.
Vì sao đúng
⚠ Gắn GPU vào VM chưa đủ — phần mềm phải biết cách dùng nó:
⚠ GPU đã gắn vào VM
↓ ⚠ nhưng THIẾU
⚠ Driver NVIDIA
⚠ Bộ công cụ CUDA
⚠ Thư viện cuDNN
↓
⚠ TensorFlow không thấy GPU
→ ⚠ âm thầm chạy bằng CPU
| Phương án | Cách giải |
|---|---|
| ⚠ A — cài driver GPU | ⚠ giải quyết trực tiếp, tự cài driver + CUDA |
| ⚠ C — Deep Learning VM image | ⚠ ảnh đã có SẴN driver, CUDA, cuDNN, TensorFlow — nhanh và ít lỗi nhất |
Vì sao các phương án khác sai
-
B (dùng PyTorch thay TensorFlow) — ⚠ không liên quan: ⚠ PyTorch cũng cần driver GPU; ⚠ đổi framework không giải quyết gì.
-
D (cấp vai trò Owner cho service account của VM) — ⚠ IAM không liên quan tới phần cứng: ⚠ và ⚠ cấp Owner là vi phạm quyền tối thiểu nghiêm trọng.
-
E (cập nhật Python 3 trên VM) — ⚠ phiên bản Python không quyết định việc thấy GPU.
Ghi nhớ
⚠ Chồng phần mềm cần cho GPU — bảng phải thuộc: | Lớp | Vai trò | |---|---| | ⚠ Driver NVIDIA | ⚠ hệ điều hành nhận ra GPU | | ⚠ CUDA Toolkit | ⚠ nền tảng tính toán song song | | ⚠ cuDNN | ⚠ thư viện tối ưu cho mạng nơ-ron | | ⚠ Framework (TF/PyTorch) bản GPU | ⚠ phải là bản hỗ trợ GPU | | ⚠ Thiếu bất kỳ lớp nào | ⚠ chạy bằng CPU mà KHÔNG báo lỗi |
Từ khoá nhận diện:
"GPU đã gắn nhưng không được dùng" → ⚠ thiếu driver / dùng Deep Learning VM image "không muốn tự cài đặt gì" → ⚠ Deep Learning VM image hoặc Vertex AI Workbench "huấn luyện quy mô lớn, được quản" → ⚠ Vertex AI custom training
| ⚠ Deep Learning VM image có sẵn gì | Có sẵn |
|---|---|
| ⚠ Driver NVIDIA, CUDA, cuDNN | |
| ⚠ TensorFlow hoặc PyTorch | ⚠ chọn biến thể khi tạo |
| ⚠ JupyterLab | |
| ⚠ Thư viện khoa học dữ liệu thông dụng | |
| ⚠ Lợi ích | ⚠ bỏ qua toàn bộ nỗi khổ tương thích phiên bản |
| ⚠ Cách kiểm tra GPU có được dùng không | Cách |
|---|---|
⚠ nvidia-smi |
⚠ thấy GPU và tiến trình đang dùng |
⚠ tf.config.list_physical_devices('GPU') |
⚠ danh sách rỗng là chưa nhận |
⚠ torch.cuda.is_available() |
|
| ⚠ Dấu hiệu gián tiếp | ⚠ huấn luyện chậm bất thường |
| ⚠ Chọn tăng tốc phần cứng | Chọn |
|---|---|
| ⚠ GPU | ⚠ linh hoạt, hợp mọi framework, mô hình vừa |
| ⚠ TPU | ⚠ tối ưu cho TensorFlow/JAX, mô hình rất lớn |
| ⚠ CPU | ⚠ mô hình nhỏ, tiền xử lý |
| ⚠ Lưu ý chi phí | ⚠ GPU rất đắt khi để VM chạy không |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | nvidia-smi có thấy GPU không | | | Framework có liệt kê thiết bị GPU không | | | VM có bị để chạy khi không huấn luyện không | ⚠ khoản lãng phí lớn |
Và điều nguy hiểm nhất ở lỗi này: nó không phải là lỗi. Mã vẫn chạy, kết quả vẫn ra, chỉ là chậm hơn hai mươi lần — và bạn trả tiền GPU suốt thời gian đó.