Ngân hàng đề — Google Cloud Associate Data Practitioner
Tìm thấy 333 câu.
A software development team is building a real-time data processing pipeline. The pipeline must ingest a stream of events and apply a series of complex, custom validation and enrichment rules that are defined in a proprietary Java library.
Which serverless service is designed to execute this type of highly customized, code-based transformation logic at scale?
- A Cloud Data Fusion
- B Cloud Functions
- C Dataproc Serverless
- D Dataflow
Xem giải thích
Đáp án
D — Dataflow.
Vì sao đúng
Đề nêu bốn điều: luồng sự kiện thời gian thực, quy tắc kiểm tra và làm giàu PHỨC TẠP, TUỲ BIẾN, định nghĩa trong một THƯ VIỆN JAVA riêng, và cần không máy chủ, chạy ở quy mô lớn. Dataflow là dịch vụ duy nhất khớp cả bốn.
⚠ Điểm mấu chốt — Beam chạy được mã Java tuỳ ý của bạn:
public class KiemTraVaLamGiau extends DoFn<Event, Event> {
private transient QuyTacNghiepVu quyTac; // thư viện riêng
@Setup
public void setup() {
quyTac = new QuyTacNghiepVu(); // khởi tạo một lần
}
@ProcessElement
public void process(@Element Event e, OutputReceiver<Event> out) {
if (quyTac.hopLe(e)) {
out.output(quyTac.lamGiau(e));
}
}
}
↓
⚠ Thư viện JAR riêng đóng gói cùng pipeline
⚠ Chạy song song trên hàng trăm worker
⚠ Không máy chủ nào phải quản lý
⚠ Vì sao ba phương án kia không phù hợp:
CLOUD DATA FUSION
→ kéo thả, dựa trên PLUGIN
→ logic tuỳ biến phức tạp trong
thư viện riêng KHÔNG diễn đạt được
bằng các node có sẵn
CLOUD FUNCTIONS
→ xử lý TỪNG sự kiện độc lập
→ không có mô hình luồng, không cửa sổ
→ kém hiệu quả ở thông lượng cao
DATAPROC SERVERLESS
→ chạy SPARK, thiên về XỬ LÝ THEO LÔ
→ Spark Structured Streaming có, nhưng
Dataflow là lựa chọn chuẩn của GCP
cho luồng không máy chủ
⚠ Đóng gói thư viện riêng vào pipeline Dataflow:
Java:
→ gói JAR vào uber-jar bằng Maven Shade
→ hoặc dùng Flex Template với container riêng
Python:
→ --requirements_file
→ --setup_file cho gói nội bộ
→ hoặc custom container image
↓
⚠ Đây là điểm mạnh: bạn mang
logic nghiệp vụ CÓ SẴN lên đám mây
Xem thêm câu #13038 (cùng lô): nêu chính tiêu chí phân biệt — code-first (Dataflow) hay low-code (Data Fusion). Câu này là ứng dụng trực tiếp: có thư viện Java riêng → code-first → Dataflow. Hai câu nhất quán.
Vì sao các phương án khác sai
-
C (Dataproc Serverless) — đây là phương án gần nhất vì cũng không máy chủ và chạy được mã Java/Scala, nhưng nó dựa trên Spark và thiên về xử lý theo LÔ; với luồng thời gian thực trên GCP, Dataflow là lựa chọn chuẩn.
-
A (Cloud Data Fusion) — kéo thả dựa trên plugin, không phải nơi chạy logic tuỳ biến phức tạp trong thư viện riêng.
-
B (Cloud Functions) — xử lý từng sự kiện độc lập, không có mô hình luồng và kém hiệu quả ở quy mô lớn.
Ghi nhớ
⚠ Chọn engine theo bản chất logic — bảng phải thuộc: | Logic | Engine | |---|---| | Tuỳ biến phức tạp, có thư viện riêng, LUỒNG | Dataflow | | Diễn đạt được bằng plugin, kéo thả | Cloud Data Fusion | | Tuỳ biến phức tạp, LÔ, đã có Spark | Dataproc / Dataproc Serverless | | Nhỏ, độc lập, theo sự kiện | Cloud Run function | | Chỉ là SQL | BigQuery / Dataform |
Từ khoá nhận diện:
"thư viện riêng, logic phức tạp, luồng, serverless" → Dataflow "kéo thả, plugin sẵn" → Cloud Data Fusion "job Spark có sẵn" → Dataproc Serverless "một sự kiện, một hành động nhỏ" → Cloud Run function "biến đổi bằng SQL" → Dataform
| Đóng gói phụ thuộc cho Dataflow | Cách |
|---|---|
| Java: uber-jar | Maven Shade Plugin |
Python: --requirements_file |
gói từ PyPI |
Python: --setup_file |
gói nội bộ của công ty |
| Custom container | Flex Template — kiểm soát hoàn toàn môi trường |
| Lưu ý | @Setup khởi tạo một lần cho mỗi worker, không phải mỗi phần tử |
| Điểm mạnh của Dataflow cho luồng | Điểm mạnh |
|---|---|
| Cửa sổ | fixed, sliding, session |
| Watermark | ước lượng "đã đủ dữ liệu chưa" |
| Allowed lateness | xử lý dữ liệu tới muộn |
| Stateful processing | giữ trạng thái theo khoá |
| Exactly-once | trong pipeline |
| Autoscaling | theo tải thật |
| Hiệu năng khi gọi logic phức tạp | Cách |
|---|---|
Khởi tạo trong @Setup |
không phải mỗi phần tử |
| Bộ nhớ đệm trong worker | cho tra cứu lặp lại |
| Tránh gọi API ngoài cho từng bản ghi | gom lô nếu được |
@Teardown |
dọn tài nguyên |
| Đo bằng Cloud Profiler | tìm hàm ngốn CPU |
| Đừng quên dead-letter | Nội dung |
|---|---|
| Quy tắc kiểm tra phức tạp | sẽ có bản ghi không hợp lệ |
TaggedOutput |
tách nhánh hỏng ra bảng riêng |
| Kèm LÝ DO thất bại | để sửa từ gốc |
| Cảnh báo theo tỉ lệ lỗi | biết khi nguồn đổi lược đồ |
| Sai lầm | ngoại lệ không bắt làm chết cả job |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Pipeline có theo kịp không | Data freshness trong Job metrics | | Logic tuỳ biến có tốn CPU không | Cloud Profiler trên worker | | Bản ghi hỏng có được giữ không | kiểm tra bảng dead-letter |
Và một chi tiết kỹ thuật rất đáng nhớ khi mang thư viện riêng vào Dataflow: khởi tạo đối tượng nặng trong @Setup, không phải trong @ProcessElement. Một quy tắc nghiệp vụ nạp cấu hình từ tệp mà bị khởi tạo lại cho từng bản ghi sẽ biến một pipeline đáng lẽ chạy vài phút thành một job kéo dài hàng giờ — và biểu đồ CPU sẽ trông hoàn toàn bình thường.
A company requires a persistent, long-running Apache Spark cluster to serve interactive queries from multiple data analysts. The cluster needs to be highly customized with specific machine types and have third-party software libraries installed.
Which Google Cloud solution provides the necessary level of control and persistence for this use case?
- A BigQuery
- B Dataproc on Compute Engine (Standard Dataproc)
- C Cloud Functions
- D Dataproc Serverless
Xem giải thích
Đáp án
B — Dataproc trên Compute Engine (Dataproc tiêu chuẩn).
Vì sao đúng
Đề nêu ba yêu cầu, và cả ba đều đòi hỏi một cụm thật do bạn kiểm soát: cụm Spark THƯỜNG TRỰC, chạy lâu dài, phục vụ truy vấn tương tác của nhiều nhà phân tích, và tuỳ biến sâu về loại máy cùng thư viện bên thứ ba.
⚠ Điểm mấu chốt — ba yêu cầu loại bỏ mọi phương án không có cụm:
"THƯỜNG TRỰC, chạy lâu dài"
→ cụm phải luôn sẵn sàng
→ serverless không có cụm để mà tồn tại
"truy vấn TƯƠNG TÁC từ nhiều nhà phân tích"
→ cần cụm sẵn sàng ngay, không chờ dựng
→ nhiều người dùng chung một cụm
"loại máy cụ thể + thư viện bên thứ ba"
→ cần initialization action
→ cần chọn machine type
↓
→ Dataproc trên Compute Engine
⚠ Tuỳ biến mà chỉ cụm thật mới có:
--initialization-actions gs://.../cai-dat.sh
→ cài phần mềm bên thứ ba lúc tạo cụm
--master-machine-type / --worker-machine-type
→ chọn đúng cấu hình cần
--optional-components=JUPYTER,ZEPPELIN
→ notebook tương tác NGAY TRÊN cụm
--properties spark:spark.executor.memory=8g
→ tinh chỉnh Spark
--enable-component-gateway
→ truy cập giao diện web của Spark, YARN
⚠ Cụm thường trực không có nghĩa là lãng phí:
Bật AUTOSCALING POLICY
→ số worker co giãn theo tải
→ giữ vài worker tối thiểu cho
truy vấn tương tác
Dùng SECONDARY WORKER là Spot VM
→ phần co giãn rẻ hơn nhiều
Đặt lịch tắt ngoài giờ làm việc
→ nếu nhà phân tích chỉ làm giờ hành chính
Xem thêm câu #13043 (cùng lô): khoá Dataproc Serverless vì ở đó mục tiêu là KHÔNG quản lý vòng đời cụm. Và #12997 (lô 135): nêu chính đánh đổi giữa hai phương án. Ba câu nhất quán — khoá khác nhau vì yêu cầu về cụm khác nhau.
Vì sao các phương án khác sai
-
D (Dataproc Serverless) — đây là phương án gần nhất và cũng chạy Spark, nhưng nó KHÔNG CÓ CỤM THƯỜNG TRỰC: mỗi lần nộp là một batch riêng, không phục vụ được truy vấn tương tác, và tuỳ biến hạn chế hơn nhiều.
-
A (BigQuery) — là kho dữ liệu SQL, không phải cụm Spark; không chạy được thư viện Spark bên thứ ba.
-
C (Cloud Functions) — chạy đoạn mã ngắn theo sự kiện, hoàn toàn không phù hợp.
Ghi nhớ
⚠ Ba cách chạy Spark trên Google Cloud — bảng phải thuộc: | Cách | Đặc điểm | |---|---| | Dataproc trên Compute Engine | cụm thật, tuỳ biến sâu, thường trực được | | Dataproc Serverless | KHÔNG có cụm, tự co giãn, tuỳ biến hạn chế | | Dataproc trên GKE | chạy Spark trong cụm Kubernetes có sẵn | | BigQuery | không phải Spark — SQL, và có Spark stored procedure | | Chọn cụm thật khi | thường trực, tương tác, tuỳ biến sâu |
Từ khoá nhận diện:
"cụm thường trực, tương tác, nhiều người dùng" → Dataproc trên Compute Engine "không muốn quản lý cụm" → Dataproc Serverless "job Spark có tham số, chạy rồi xoá cụm" → Workflow Template + managed cluster "đã có GKE" → Dataproc trên GKE "chỉ cần SQL" → BigQuery
| Tuỳ biến của cụm Dataproc | Tuỳ chọn |
|---|---|
--initialization-actions |
cài phần mềm lúc tạo cụm |
--metadata |
truyền tham số cho script |
--image-version |
chọn phiên bản Dataproc/Spark |
--optional-components |
Jupyter, Zeppelin, Presto, Flink |
--properties |
tinh chỉnh Spark, YARN, Hive |
--enable-component-gateway |
giao diện web an toàn |
| Custom image | đóng gói sẵn mọi thứ — khởi động nhanh hơn |
| Cụm phục vụ nhiều nhà phân tích | Cấu hình |
|---|---|
| Autoscaling policy | co giãn theo tải |
| Secondary worker (Spot) | phần co giãn rẻ hơn |
| Component Gateway | truy cập Jupyter, Spark UI |
| Dataproc Hub | notebook riêng cho từng người |
| YARN queue | chia tài nguyên giữa các nhóm |
| Personal Auth Cluster | mỗi người dùng danh tính riêng |
| Chi phí cụm thường trực — kiểm soát thế nào | Cách |
|---|---|
Autoscaling với minInstances thấp |
|
| Spot VM cho secondary worker | rẻ hơn đáng kể |
--max-idle |
tự tắt khi rảnh — cẩn thận với cụm tương tác |
| Đặt lịch tắt ngoài giờ | nếu chỉ dùng giờ hành chính |
| Committed use discount | nếu cụm chạy liên tục |
| Rà soát | danh sách cụm hằng tuần |
| Lưu dữ liệu ở đâu | Nơi |
|---|---|
| Cloud Storage | KHUYẾN NGHỊ — cụm xoá đi dữ liệu vẫn còn |
| HDFS trên cụm | chỉ cho dữ liệu tạm |
| BigQuery | qua connector |
| Dataproc Metastore | siêu dữ liệu Hive dùng chung giữa các cụm |
| 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 |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Cụm cấu hình thế nào | gcloud dataproc clusters describe <ten> --region=<r> | | Tài nguyên có bị lãng phí không | YARN UI qua Component Gateway | | Chi phí bao nhiêu | billing export, lọc SKU Dataproc |
Và một cấu hình rất đáng dựng cùng lúc với cụm thường trực: Dataproc Metastore dùng chung. Nó tách siêu dữ liệu Hive ra khỏi vòng đời của cụm, nên khi bạn cần dựng lại cụm với cấu hình mới — điều chắc chắn sẽ xảy ra — các bảng mà nhà phân tích đã tạo vẫn còn nguyên.
A data science team needs to run daily Spark batch jobs for model training. Their primary goal is to minimize operational overhead and completely avoid managing the lifecycle of clusters. They want a solution where they can simply submit their code and have Google Cloud handle all infrastructure provisioning and teardown.
Which service is the best fit for this requirement?
- A Dataproc Serverless
- B Dataproc on GKE (Google Kubernetes Engine)
- C Manual Spark installation on a Compute Engine VM (Virtual Machine)
- D Dataproc on Compute Engine
Xem giải thích
Đáp án
A — Dataproc Serverless.
Vì sao đúng
Đề nêu ba điều rất rõ: giảm tối đa công vận hành, HOÀN TOÀN tránh quản lý vòng đời cụm, và chỉ muốn nộp mã rồi để Google lo mọi việc cấp phát và dọn dẹp hạ tầng. Đó là định nghĩa của Dataproc Serverless.
⚠ Điểm mấu chốt — nộp job, không có cụm:
gcloud dataproc batches submit pyspark \
gs://bucket/huan_luyen.py \
--region=asia-southeast1 \
--deps-bucket=gs://bucket-tam
↓
⚠ KHÔNG có tên cụm
⚠ KHÔNG có số worker
⚠ KHÔNG có gì để tắt sau khi xong
↓
Google tự:
cấp tài nguyên → chạy → thu hồi
⚠ Vì sao hợp với job huấn luyện hằng ngày:
Job chạy MỘT LẦN mỗi ngày, rồi kết thúc
↓
Cụm thường trực
↓
⚠ nhàn rỗi hơn 95% thời gian
⚠ vẫn tính tiền 24/7
Serverless
↓
→ trả tiền ĐÚNG thời gian job chạy
→ không có thời gian dựng cụm
→ không ai quên tắt
⚠ Vẫn tuỳ biến được, chỉ là ít hơn:
--properties spark.executor.memory=8g
→ tinh chỉnh Spark
--container-image gs://.../image
→ CUSTOM CONTAINER cho thư viện riêng
--version 2.2
→ chọn runtime version
--subnet
→ chạy trong VPC của bạn
↓
⚠ Không tuỳ biến được: machine type
cụ thể, initialization action,
thành phần như Hive/Presto
Xem thêm câu #13042 (cùng lô): khoá Dataproc trên Compute Engine vì cần cụm THƯỜNG TRỰC cho truy vấn tương tác và tuỳ biến sâu. Và #12997 (lô 135): nêu chính đánh đổi — ít kiểm soát, đổi lấy đơn giản vận hành. Ba câu nhất quán.
Vì sao các phương án khác sai
-
D (Dataproc trên Compute Engine) — đây là phương án gần nhất và chạy được, nhưng nó đòi quản lý vòng đời cụm — đúng thứ đề muốn tránh hoàn toàn. (Workflow Template với managed cluster gần hơn nữa, nhưng vẫn có khái niệm cụm.)
-
B (Dataproc trên GKE) — đòi có sẵn và quản lý một cụm Kubernetes; công vận hành còn cao hơn.
-
C (tự cài Spark trên VM) — công vận hành cao nhất: tự cài, tự vá, tự co giãn, tự tắt.
Ghi nhớ
⚠ Bốn cách chạy Spark — theo công vận hành: | Cách | Công vận hành | |---|---| | Dataproc Serverless | thấp nhất — không có cụm | | Workflow Template + managed cluster | thấp — cụm tự tạo và tự xoá | | Dataproc trên Compute Engine | trung bình — bạn quản cụm | | Dataproc trên GKE | cao — thêm cả cụm Kubernetes | | Tự cài trên VM | cao nhất |
Từ khoá nhận diện:
"không muốn quản lý cụm chút nào" → Dataproc Serverless "cụm thường trực, tương tác" → Dataproc trên Compute Engine "job có tham số, dùng lại" → Workflow Template "đã có GKE" → Dataproc trên GKE "tự cài Spark" → luôn là phương án kém nhất trong đề thi
| Dataproc Serverless — điều cần nhớ | Nội dung |
|---|---|
| Lệnh | gcloud dataproc batches submit |
| Hỗ trợ | Spark, PySpark, SparkR, Spark SQL |
| Tự co giãn executor | theo tải của job |
| Runtime version | chọn phiên bản Spark |
| Thư viện thêm | custom container image |
| Mạng | chạy trong subnet của bạn, cần Private Google Access |
| Không hỗ trợ | Hive, HBase, Presto, initialization action |
| Khi nào Serverless KHÔNG đủ | Trường hợp |
|---|---|
| Cần Hive, HBase, Presto, Flink | → cụm thật |
| Cần notebook tương tác lâu dài | → cụm thật + Component Gateway |
| Cần initialization action phức tạp | → cụm thật, hoặc custom container |
| Tải liên tục, dày đặc | → cụm thường trực có thể rẻ hơn |
| Cần GPU cấu hình đặc thù | → cụm thật |
| Đóng gói phụ thuộc cho Serverless | Cách |
|---|---|
--deps-bucket |
nơi tải tệp phụ trợ |
--jars, --py-files |
thư viện đi kèm |
--properties spark.jars.packages |
gói từ Maven |
| Custom container image | cách bền nhất cho môi trường phức tạp |
| Với huấn luyện mô hình | thường cần scikit-learn, pandas, thư viện riêng |
| Chi phí — vì sao serverless hợp với job rời rạc | Nội dung |
|---|---|
| Trả theo tài nguyên job dùng thật | không có thời gian nhàn rỗi |
| Không mất thời gian dựng cụm | khởi động nhanh |
| Không ai quên tắt | rủi ro cấu trúc được loại bỏ |
| Với job liên tục cả ngày | cụm thường trực có thể rẻ hơn |
| Cách quyết | ước tính với số liệu thật của cả hai |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Job chạy thế nào | gcloud dataproc batches describe <id> --region=<r> | | Tốn bao nhiêu tài nguyên | chỉ số của batch trong Monitoring | | Có cụm nào bị bỏ quên không | gcloud dataproc clusters list |
Và một khoản chi phí nên rà soát nếu tổ chức đã dùng Dataproc lâu năm: danh sách cụm đang chạy nhưng không ai còn dùng. Đây là loại lãng phí mà Dataproc Serverless loại bỏ về mặt cấu trúc chứ không phải bằng kỷ luật — khi không có cụm nào tồn tại giữa các lần chạy, không có gì để quên tắt.
A data engineer needs to implement a cost-optimization strategy for a large, time-series table in BigQuery. The strategy involves automatically deleting monthly partitions after 36 months and reducing storage costs for partitions that are between 90 days and 36 months old.
What is the most critical prerequisite for implementing any of these time-based lifecycle policies?
- A The project must have BigQuery reservations enabled.
- B The table must be partitioned by a date or timestamp column.
- C The table must be backed up to Cloud Storage daily.
- D The data must be loaded into the table using the Storage Write API.
Xem giải thích
Đáp án
B — Bảng PHẢI được phân vùng theo một cột kiểu ngày hoặc dấu thời gian.
Vì sao đúng
Cả hai chiến lược trong đề — tự xoá phân vùng sau 36 tháng và giảm chi phí lưu cho phân vùng từ 90 ngày tới 36 tháng — đều thao tác ở cấp PHÂN VÙNG. Không có phân vùng thì không có gì để áp chính sách lên.
⚠ Điểm mấu chốt — cả hai cơ chế đều cần phân vùng:
TỰ XOÁ SAU 36 THÁNG
→ partition_expiration_days
↓
⚠ Chỉ tồn tại với bảng CÓ PHÂN VÙNG
→ không phân vùng thì phải DELETE thủ công,
tốn tiền và chậm
GIẢM CHI PHÍ CHO DỮ LIỆU 90 NGÀY – 36 THÁNG
→ long-term storage
↓
⚠ Tính theo TỪNG PHÂN VÙNG
→ bảng không phân vùng: MỘT dòng ghi mới
RESET đồng hồ cho TOÀN BỘ bảng
⚠ Vì sao điều thứ hai quan trọng hơn người ta tưởng:
Bảng chuỗi thời gian, KHÔNG phân vùng
↓
Mỗi ngày ghi thêm dữ liệu mới
↓
→ "lần sửa cuối" luôn là HÔM NAY
→ KHÔNG BAO GIỜ đạt 90 ngày
→ KHÔNG BAO GIỜ được giá long-term
↓
⚠ Trả giá đầy đủ cho toàn bộ lịch sử,
mãi mãi
⚠ Có phân vùng thì cả hai chạy tự động:
CREATE TABLE `du_an.chuoi_thoi_gian`
PARTITION BY DATE_TRUNC(event_date, MONTH)
OPTIONS (
partition_expiration_days = 1096 -- 36 tháng
) AS SELECT ...;
↓
→ phân vùng cũ hơn 36 tháng: TỰ XOÁ
→ phân vùng không sửa 90 ngày:
TỰ được giá long-term (~50%)
↓
⚠ Không có job nào phải chạy
Xem thêm câu #13039 (cùng lô): áp dụng chính partition expiration để xoá sau 48 tháng. Và #12979 (lô 134): phân vùng để giảm chi phí QUÉT. Và #12944 (lô 134): long-term storage giảm ~50%. Bốn câu cùng chỉ về một điều kiện nền: PHÂN VÙNG.
Vì sao các phương án khác sai
-
D (phải nạp bằng Storage Write API) — đây là phương án gần nhất về mặt "liên quan tới cách ghi dữ liệu", nhưng cách nạp không quyết định gì về chính sách vòng đời; Storage Write API chỉ là một giao diện ghi hiệu quả.
-
A (phải bật BigQuery reservations) — reservation là mô hình TÍNH TIỀN theo slot cho TRUY VẤN, không liên quan tới lưu trữ hay vòng đời.
-
C (phải sao lưu sang Cloud Storage hằng ngày) — là một thực hành có thể tốt, nhưng không phải điều kiện để đặt chính sách vòng đời.
Ghi nhớ
⚠ Những gì PHÂN VÙNG mở khoá — bảng phải thuộc: | Lợi ích | Nội dung | |---|---| | Partition pruning | giảm mạnh byte quét khi lọc theo ngày | | partition_expiration_days | tự XOÁ phân vùng quá tuổi | | Long-term storage theo TỪNG phân vùng | phân vùng cũ tự giảm ~50% giá | | Ghi đè một phân vùng | nạp lại một ngày mà không đụng ngày khác | | require_partition_filter | chặn truy vấn quét cả bảng | | DELETE theo phân vùng | rẻ hơn nhiều |
Từ khoá nhận diện:
"chính sách vòng đời theo thời gian" → bảng phải PHÂN VÙNG "tự xoá dữ liệu cũ" → partition expiration "tự giảm giá lưu sau 90 ngày" → long-term storage (tự động) "giảm chi phí truy vấn" → partition pruning "reservations" → chi phí TRUY VẤN, không phải lưu trữ
| Ba loại phân vùng | Loại |
|---|---|
| Theo CỘT thời gian | PARTITION BY DATE(cot) hoặc DATE_TRUNC(cot, MONTH) |
| Theo THỜI ĐIỂM NẠP | _PARTITIONTIME — khi không có cột ngày |
| Theo DẢI SỐ NGUYÊN | RANGE_BUCKET |
| Mức chia | ngày, giờ, tháng, năm |
| Giới hạn | 4.000 phân vùng mỗi bảng |
| Chọn mức chia phân vùng | Mức |
|---|---|
| Ngày | phổ biến nhất — 4.000 ngày ≈ 11 năm |
| Tháng | giữ được lịch sử rất dài — hợp với đề này (36 tháng) |
| Giờ | dữ liệu cực lớn mỗi ngày, hay lọc theo giờ |
| Năm | dữ liệu rất thưa |
| Lưu ý | quá nhiều phân vùng nhỏ cũng làm chậm |
| Long-term storage — nhắc lại | Nội dung |
|---|---|
| Điều kiện | 90 ngày liên tiếp KHÔNG SỬA ĐỔI |
| Giá | ≈ 50% active storage |
| Truy vấn KHÔNG reset đồng hồ | chỉ sửa đổi mới reset |
| Tính theo từng PHÂN VÙNG | với bảng có phân vùng |
| Tự động | không cần cấu hình gì |
| Kết hợp phân vùng và phân cụm | Nội dung |
|---|---|
| Phân vùng theo NGÀY/THÁNG | cắt theo thời gian |
| Phân cụm theo cột hay lọc/join | sắp xếp trong phân vùng |
| Dùng CẢ HAI | thực hành chuẩn cho bảng lớn |
| Với chuỗi thời gian | gần như luôn nên có cả hai |
| Kiểm tra | bq show → Time Partitioning và Clustered By |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bảng có phân vùng chưa | bq show <dataset>.<bảng> → Time Partitioning | | Bao nhiêu dữ liệu ở long-term | INFORMATION_SCHEMA.TABLE_STORAGE → LONG_TERM_LOGICAL_BYTES | | Có bao nhiêu phân vùng | INFORMATION_SCHEMA.PARTITIONS |
Và một hệ quả tài chính rất dễ bị bỏ qua với bảng chuỗi thời gian không phân vùng: nó sẽ không bao giờ hưởng giá long-term storage. Chỉ cần thêm một dòng mỗi ngày là đồng hồ 90 ngày của toàn bộ bảng bị reset — nên với dữ liệu lịch sử nhiều terabyte, việc phân vùng không chỉ giúp truy vấn nhanh hơn mà còn cắt đôi hoá đơn lưu trữ.
An executive wants to be able to view a live, interactive "Company Health" dashboard at any time, while a department head only needs a static report of their team's metrics emailed to them every Friday.
What is the key difference between fulfilling these two requests in Looker?
- A Both requests are fulfilled by creating separate scheduled deliveries.
- B The executive needs a scheduled delivery, while the department head needs 'View' access to the dashboard's folder.
- C The executive needs 'View' access to the dashboard's folder for live viewing, while the department head needs a scheduled delivery for the static report.
- D Both requests are fulfilled by granting 'View' access to the dashboard's folder.
Xem giải thích
Đáp án
C — Giám đốc cần quyền 'View' trên folder chứa dashboard để xem trực tiếp, còn trưởng phòng cần một SCHEDULED DELIVERY để nhận báo cáo tĩnh.
Vì sao đúng
Hai yêu cầu trong đề là hai kiểu tiêu thụ dữ liệu khác nhau, và Looker có hai cơ chế riêng cho chúng.
⚠ Điểm mấu chốt — "xem bất cứ lúc nào" ↔ "nhận vào thứ Sáu":
GIÁM ĐỐC
"xem TRỰC TIẾP, TƯƠNG TÁC,
BẤT CỨ LÚC NÀO"
↓
→ phải ĐĂNG NHẬP Looker
→ cần QUYỀN trên folder chứa dashboard
↓
Quyền 'View' là đủ
TRƯỞNG PHÒNG
"báo cáo TĨNH, gửi qua email
mỗi thứ Sáu"
↓
→ KHÔNG cần đăng nhập Looker
→ cần SCHEDULED DELIVERY
↓
Looker tự chạy và gửi vào giờ đã đặt
⚠ Scheduled delivery — cấu hình gì:
Từ dashboard: Schedule delivery
↓
- Đích: email, Slack, GCS, SFTP,
webhook
- Định dạng: PDF, PNG, CSV, XLSX
- Lịch: mỗi thứ Sáu, giờ cụ thể
- Bộ lọc: cố định cho lần gửi này
- Điều kiện: chỉ gửi khi thoả điều kiện
↓
⚠ Người nhận KHÔNG cần tài khoản Looker
⚠ Một lưu ý bảo mật quan trọng của scheduled delivery:
Báo cáo chạy dưới danh nghĩa
NGƯỜI TẠO LỊCH GỬI
↓
⚠ Nếu có access_filter theo user attribute,
dữ liệu trong PDF là dữ liệu mà
NGƯỜI TẠO LỊCH thấy được
↓
→ không phải dữ liệu của người NHẬN
↓
Muốn mỗi người nhận dữ liệu riêng
→ dùng "Send to each recipient"
(delivery theo từng người)
Xem thêm câu #13013 (lô 135): về quyền nội dung bằng folder + group. Câu này thêm chiều thứ hai: cách tiêu thụ — trực tiếp hay theo lịch. Hai câu bổ sung nhau.
Vì sao các phương án khác sai
-
B (đảo ngược hai vế) — đây là phương án gần nhất và dùng đúng hai cơ chế, nhưng gán nhầm cho từng người: giám đốc cần xem trực tiếp (quyền folder), trưởng phòng cần bản tĩnh (scheduled delivery).
-
A (cả hai đều dùng scheduled delivery) — giám đốc muốn xem bất cứ lúc nào và tương tác; một bản PDF gửi định kỳ không đáp ứng được.
-
D (cả hai đều chỉ cần quyền 'View') — trưởng phòng muốn nhận email tự động; quyền xem không tự gửi gì cả.
Ghi nhớ
⚠ Hai cách tiêu thụ nội dung Looker — bảng phải thuộc: | Cách | Cơ chế | Người dùng | |---|---|---| | Xem trực tiếp, tương tác | quyền 'View' trên folder | cần tài khoản Looker | | Nhận báo cáo tĩnh theo lịch | scheduled delivery | KHÔNG cần tài khoản | | Nhúng vào ứng dụng khác | signed embed | không cần tài khoản Google | | Cảnh báo khi vượt ngưỡng | Looker Alerts | | | Truy cập bằng mã | Looker API | |
Từ khoá nhận diện:
"xem bất cứ lúc nào, tương tác" → quyền folder "gửi email định kỳ, bản tĩnh" → scheduled delivery "người nhận không có tài khoản Looker" → scheduled delivery "nhúng vào sản phẩm SaaS" → signed embed "báo khi số vượt ngưỡng" → Looker Alerts
| Scheduled delivery — các đích gửi | Đích |
|---|---|
| phổ biến nhất | |
| Slack | tích hợp sẵn |
| Cloud Storage | lưu bản báo cáo |
| SFTP | gửi cho hệ thống bên ngoài |
| Webhook | kích hoạt quy trình khác |
| Định dạng | PDF, PNG, CSV, XLSX, JSON |
| Ba tuỳ chọn nâng cao đáng biết | Tuỳ chọn |
|---|---|
| Gửi có điều kiện | chỉ gửi khi kết quả thoả điều kiện |
| Send to each recipient | mỗi người nhận dữ liệu THEO QUYỀN CỦA HỌ |
| Bộ lọc cố định cho lần gửi | không ảnh hưởng dashboard gốc |
| Định dạng bảng hoặc hình | tuỳ nhu cầu người nhận |
| Múi giờ | khai rõ, tránh gửi lệch ngày |
| Looker Alerts — khác scheduled delivery | Nội dung |
|---|---|
| Alert | chỉ báo KHI có bất thường |
| Scheduled delivery | gửi đều đặn dù có gì hay không |
| Alert hợp với | doanh số tụt, tồn kho cạn, lỗi tăng |
| Delivery hợp với | báo cáo định kỳ như đề này |
| Kết hợp | báo cáo tuần + cảnh báo tức thời |
| Bẫy bảo mật của báo cáo gửi tự động | Bẫy |
|---|---|
| Chạy dưới danh nghĩa NGƯỜI TẠO LỊCH | không phải người nhận |
| → PDF có thể chứa dữ liệu vượt quyền người nhận | |
| Khắc phục | "Send to each recipient" |
| Người nhận ngoài công ty | cân nhắc rất kỹ nội dung |
| PDF không thu hồi được | như mọi tệp gửi đi |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Lịch gửi cấu hình đúng chưa | Admin → Schedules | | Người nhận thấy dữ liệu của ai | kiểm tra ai tạo lịch và có bật per-recipient không | | Giám đốc xem được dashboard chưa | impersonate (sudo) và thử |
Và một câu hỏi nên đặt ra trước khi bật báo cáo gửi tự động ra ngoài đội: bản PDF này chứa dữ liệu của ai? Với mô hình có access_filter, báo cáo chạy dưới quyền người tạo lịch chứ không phải người nhận — nên một lịch gửi do quản trị viên tạo có thể vô tình gửi toàn bộ dữ liệu công ty cho một người lẽ ra chỉ được xem phần của phòng mình.
A company has a single "Regional Sales" dashboard in Looker that is shared with all of its regional managers. The underlying data model has a sales_region field. The current setup allows every manager to see the sales data for all regions, but the company wants to enforce a security policy where managers can only view the data for their own specific region.
The solution must be scalable and should not require creating and maintaining a separate dashboard for each manager.
What is the standard Looker method to implement this kind of row-level security?
-
A
Instruct each manager to manually add a filter for their own region every time they view the dashboard.
-
B
Create a user attribute for
sales_region, assign the appropriate region to each manager, and use anaccess_filterparameter in the relevant LookML explore. -
C
Create five copies of the dashboard and apply a hard-coded filter for each specific region.
-
D
Build a separate LookML model for each sales region.
Xem giải thích
Đáp án
B — Tạo user attribute cho sales_region, gán vùng tương ứng cho từng quản lý, và dùng tham số access_filter trong explore của LookML.
Vì sao đúng
Đề nêu hai ràng buộc: mỗi quản lý chỉ thấy dữ liệu vùng của mình, và giải pháp phải mở rộng được, KHÔNG nhân bản dashboard. Bảo mật cấp dòng bằng user attribute là cách chuẩn của Looker.
⚠ Điểm mấu chốt — cấu hình một lần, áp cho mọi người:
explore: doanh_so {
access_filter: {
field: doanh_so.sales_region
user_attribute: vung_ban_hang
}
}
↓
Mỗi quản lý có thuộc tính
vung_ban_hang = "Mien Bac" / "Mien Nam"...
↓
Looker TỰ THÊM vào mọi truy vấn:
WHERE sales_region = '<vùng của họ>'
↓
⚠ MỘT dashboard duy nhất
⚠ N quản lý, mỗi người thấy vùng mình
⚠ Thêm vùng mới: chỉ gán thuộc tính
⚠ Vì sao lọc ở TẦNG MÔ HÌNH mới là bảo mật:
Lọc trong dashboard hoặc trên URL
↓
⚠ Người dùng SỬA ĐƯỢC bộ lọc
⚠ Sửa URL là xem được vùng khác
↓
→ đó là TIỆN LỢI, không phải BẢO MẬT
access_filter trong explore
↓
→ điều kiện được thêm vào SQL
TRƯỚC KHI truy vấn chạy
→ người dùng KHÔNG nhìn thấy,
KHÔNG gỡ được
⚠ Vì sao "mỗi người một dashboard" là phản mẫu:
5 vùng → 5 dashboard hôm nay
↓
Thêm vùng mới → dashboard thứ 6
Sửa một biểu đồ → sửa 6 lần
Một lần quên → 6 bản không còn giống nhau
↓
⚠ Và vẫn KHÔNG bảo mật: quản lý vùng A
mở được URL dashboard vùng B nếu
có quyền folder
Xem thêm câu #13035 (cùng lô): gần như cùng một câu hỏi (một dashboard chung, mỗi nhân viên chỉ thấy tài khoản của mình) và CÙNG KHOÁ: user attribute +
access_filter. Hai câu hoàn toàn nhất quán — chỉ khác ở chỗ #13035 nêu thêm phần cấp quyền folder cho group. Và #12978 (lô 134) dùng cùng cơ chế cho nhúng đa khách hàng.
Vì sao các phương án khác sai
-
C (tạo 5 bản sao dashboard với bộ lọc cố định) — đây là phương án gần nhất về mặt "cũng ra kết quả đúng", nhưng không mở rộng được và không phải bảo mật: bộ lọc cứng trong dashboard không ngăn ai mở dashboard khác.
-
A (yêu cầu mỗi quản lý tự thêm bộ lọc) — không phải cơ chế bảo mật nào cả; hoàn toàn dựa vào kỷ luật của người dùng.
-
D (xây một LookML model riêng cho mỗi vùng) — nhân bản mô hình, còn tệ hơn nhân bản dashboard về mặt bảo trì.
Ghi nhớ
⚠ Bảo mật cấp dòng trong Looker — bảng phải thuộc: | Thành phần | Việc | |---|---| | User attribute | giá trị riêng của từng người dùng | | access_filter | lọc DÒNG theo user attribute | | access_grant | ẩn/hiện TRƯỜNG hoặc explore | | sql_always_where | lọc cứng cho mọi truy vấn của explore | | Folder permission | ai thấy dashboard nào | | Nguyên tắc | lọc ở TẦNG MÔ HÌNH, không ở giao diện |
Từ khoá nhận diện:
"một dashboard, mỗi người dữ liệu riêng" → user attribute +
access_filter"ẩn một số trường" →access_grant"cho cả nhóm xem" → folder + group "nhân bản dashboard cho từng người" → luôn là phương án SAI "tự thêm bộ lọc" → không phải bảo mật
| User attribute — nguồn giá trị | Nguồn |
|---|---|
| Gán tay cho từng người | phù hợp khi ít người |
| Gán theo GROUP | mọi người trong group có cùng giá trị |
| Lấy từ SSO (SAML/OIDC) | cách mở rộng tốt nhất |
| Giá trị mặc định | rất quan trọng — xem lưu ý cuối bài |
| Nhiều giá trị | phân tách bằng dấu phẩy |
access_filter — chi tiết cần nhớ |
Nội dung |
|---|---|
| Khai trong | explore, không phải trong view |
field |
trường dùng để lọc |
user_attribute |
thuộc tính chứa giá trị |
Nhiều access_filter |
kết hợp bằng AND |
| Người dùng không thấy | điều kiện không hiện trên giao diện |
| Kiểm tra | xem SQL sinh ra trong tab SQL |
| Hai tầng lọc dòng — nên chọn ở đâu | Nơi |
|---|---|
Looker access_filter |
áp cho người dùng Looker |
| BigQuery row-level security | áp cho MỌI công cụ truy vấn |
| Kết hợp cả hai | phòng thủ nhiều lớp |
| Chọn Looker khi | chỉ truy cập qua Looker |
| Chọn BigQuery khi | nhiều công cụ cùng đọc |
| Kiểm thử bảo mật cấp dòng | Cách |
|---|---|
sudo (impersonate) |
xem dưới danh nghĩa từng quản lý |
| Xem SQL sinh ra | xác nhận có điều kiện lọc |
| Thử nghiệm chéo | quản lý vùng A có xem được vùng B không |
| Thử người CHƯA có thuộc tính | họ thấy gì |
| Thử qua scheduled delivery | báo cáo gửi đi có lọc đúng không |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Thuộc tính đã gán chưa | Admin → Users → user attributes | | Bộ lọc có áp không | tab SQL trong Explore | | Có lách được không | impersonate và thử nghiệm chéo |
Và một trường hợp biên phải xử lý trước khi mở cho toàn đội: quản lý CHƯA được gán vung_ban_hang sẽ thấy gì? Tuỳ cấu hình, họ có thể thấy toàn bộ dữ liệu mọi vùng — nên hãy đặt giá trị mặc định là một chuỗi không khớp với bất kỳ vùng nào, và kiểm thử đúng tình huống ấy trước khi coi là đã xong.
A data engineering team needs to run a daily sequence of three jobs—a Spark job, followed by a Hive job, and then a shell script to clean up temporary files. The entire process runs on a single Dataproc cluster and has no dependencies on other Google Cloud services.
Which tool should they use to automate this workflow to minimize complexity and management overhead?
- A A custom script on a Compute Engine instance
- B Cloud Composer
- C Dataproc Workflow Templates
- D Cloud Functions
Xem giải thích
Đáp án
C — Dataproc Workflow Templates.
Vì sao đúng
Đề nêu ba điều quyết định: ba job chạy tuần tự, toàn bộ trên MỘT cụm Dataproc, và KHÔNG phụ thuộc dịch vụ Google Cloud nào khác — với mục tiêu giảm tối đa độ phức tạp và công quản lý.
⚠ Điểm mấu chốt — luồng nằm gọn trong Dataproc:
Spark job → Hive job → shell script dọn dẹp
↓
⚠ CẢ BA đều là job của Dataproc
⚠ KHÔNG có bước nào gọi BigQuery,
Cloud Storage API, hay gửi thông báo
↓
→ Workflow Template là đủ
→ Cloud Composer là quá tay
⚠ Khai template với ba bước phụ thuộc:
gcloud dataproc workflow-templates create luong-hang-ngay \
--region=asia-southeast1
gcloud dataproc workflow-templates add-job spark \
--workflow-template=luong-hang-ngay \
--step-id=buoc-spark ...
gcloud dataproc workflow-templates add-job hive \
--workflow-template=luong-hang-ngay \
--step-id=buoc-hive --start-after=buoc-spark ...
gcloud dataproc workflow-templates add-job pig \
--workflow-template=luong-hang-ngay \
--step-id=buoc-don --start-after=buoc-hive ...
↓
⚠ --start-after chính là PHỤ THUỘC
→ bước sau chỉ chạy khi bước trước XONG
⚠ Và managed cluster loại bỏ việc quản lý cụm:
gcloud dataproc workflow-templates \
set-managed-cluster --workflow-template=luong-hang-ngay \
--cluster-name=cum-tam --num-workers=4
↓
Mỗi lần chạy template:
1. TỰ TẠO cụm
2. Chạy ba bước theo thứ tự
3. TỰ XOÁ cụm
↓
⚠ Không có cụm nào nằm không
⚠ Không ai quên tắt
Xem thêm câu #12954 (lô 134): cùng khoá Workflow Template, cho job Spark dùng lại có tham số. Và #13015 (lô 135): nêu chính ranh giới — Composer khi luồng chạm NHIỀU dịch vụ. Câu này luồng chỉ trong Dataproc → Workflow Template. Ba câu hoàn toàn nhất quán.
Vì sao các phương án khác sai
-
B (Cloud Composer) — đây là phương án gần nhất và chắc chắn làm được, nhưng nó đòi dựng một môi trường Airflow thường trực với chi phí nền đáng kể — trái mục tiêu "giảm tối đa độ phức tạp và công quản lý" cho một luồng nằm gọn trong Dataproc.
-
A (script tuỳ chỉnh trên một VM Compute Engine) — thêm một máy phải nuôi và vá, tự lo thử lại và theo dõi.
-
D (Cloud Functions) — chạy đoạn mã ngắn; ghép ba job Dataproc bằng hàm là tự dựng lại một bộ điều phối tồi.
Ghi nhớ
⚠ Chọn công cụ điều phối theo PHẠM VI — bảng phải thuộc: | Phạm vi luồng | Công cụ | |---|---| | Chỉ trong Dataproc | Dataproc Workflow Template | | Chỉ trong BigQuery (SQL) | Dataform | | Vài bước xuyên dịch vụ, nhẹ | Cloud Workflows | | Nhiều dịch vụ, phụ thuộc phức tạp | Cloud Composer | | Một lời gọi theo giờ | Cloud Scheduler | | Nguyên tắc | chọn mức NHẸ NHẤT còn đủ dùng |
Từ khoá nhận diện:
"nhiều job, chỉ trong Dataproc" → Workflow Template "chạm tới BigQuery, GCS, thông báo" → Cloud Composer "một job theo giờ" → Cloud Scheduler "chuỗi SQL trong BigQuery" → Dataform "script trên VM" → luôn là phương án kém nhất
| Workflow Template — tính năng | Tính năng |
|---|---|
--start-after |
khai PHỤ THUỘC giữa các bước |
| Tham số hoá | --parameters="INPUT=...,OUTPUT=..." |
| Managed cluster | tự tạo và TỰ XOÁ cụm |
| Cluster selector | dùng cụm đang có, chọn theo nhãn |
| Nhiều loại job | Spark, PySpark, Hive, Pig, SparkSQL, Hadoop, Presto |
| Miễn phí | chỉ trả tiền cụm khi chạy |
| Chạy template theo lịch | Cách |
|---|---|
Cloud Scheduler gọi workflowTemplates:instantiate |
cách đơn giản nhất |
| Cloud Composer gọi template | nếu đã có Composer cho việc khác |
| Cloud Functions | không cần thiết |
| Xác thực | OAuth token với roles/dataproc.editor |
| Kết quả | luồng hằng ngày, không có cụm nằm không |
| Managed cluster ↔ cluster selector | Nội dung |
|---|---|
| Managed cluster | tạo mới mỗi lần chạy, xoá sau khi xong |
| Cluster selector | dùng cụm đang có, chọn theo nhãn |
| Chọn managed khi | job theo lịch, không cần cụm giữa các lần |
| Chọn selector khi | cụm thường trực phục vụ nhiều việc |
| Với đề này | managed cluster là gọn nhất |
| Khi nào phải nâng lên Composer | Dấu hiệu |
|---|---|
| Luồng chạm dịch vụ ngoài Dataproc | BigQuery, Pub/Sub, thông báo |
| Cần backfill cho quá khứ | |
| Cần sensor chờ dữ liệu tới | |
| Nhiều luồng, nhiều đội dùng chung | chi phí nền được chia đều |
| Rẽ nhánh, điều kiện phức tạp |
| Kết hợp cả hai — mẫu hợp lý | Mẫu |
|---|---|
| Composer điều phối tổng thể | |
| Gọi Workflow Template cho phần Dataproc | |
| Operator | DataprocInstantiateWorkflowTemplateOperator |
| Lợi ích | logic Spark đóng gói gọn, Composer không cần biết chi tiết |
| Với đề này | chưa cần — luồng chưa chạm ra ngoài |
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 | gcloud dataproc operations list | | Có cụm bị bỏ quên không | gcloud dataproc clusters list |
Và một cách kiểm tra nhanh mỗi khi phân vân giữa Workflow Template và Cloud Composer: liệt kê từng bước rồi ghi tên dịch vụ bên cạnh. Nếu cột dịch vụ chỉ toàn chữ "Dataproc" như trong đề này, bạn đang định trả chi phí thường trực cho một thứ mà Workflow Template làm được miễn phí.
A healthcare organization uses a Google Cloud Storage bucket to store patient medical records that are subject to strict regulatory compliance. The regulations require that once a record is uploaded, it must be immutable—it cannot be deleted or modified by any user, including administrators—for a mandatory retention period of 10 years.
Which Cloud Storage feature should be configured to enforce this requirement?
-
A
Fine-grained IAM permissions removing the
storage.objects.deletepermission -
B
Object Versioning
-
C
A Lifecycle Rule that moves objects to Archive storage after one day
-
D
Bucket Lock with a 10-year retention policy
Xem giải thích
Đáp án
D — Bucket Lock kèm retention policy 10 năm.
Vì sao đúng
Yêu cầu là BẤT BIẾN TUYỆT ĐỐI: không ai — kể cả quản trị viên — được xoá hay sửa bản ghi trong 10 năm. Chỉ Bucket Lock cho mức bảo đảm đó.
⚠ Điểm mấu chốt — retention policy chặn xoá, Bucket Lock chặn cả việc gỡ chính sách:
RETENTION POLICY
↓
Đối tượng KHÔNG XOÁ, KHÔNG GHI ĐÈ được
trước khi đủ tuổi
↓
⚠ Nhưng quản trị viên vẫn GỠ ĐƯỢC
chính sách rồi xoá
BUCKET LOCK
↓
KHOÁ retention policy lại
↓
⚠ KHÔNG AI gỡ được — kể cả chủ project
⚠ KHÔNG rút ngắn được thời gian giữ
⚠ KHÔNG xoá được bucket khi còn
đối tượng chưa hết hạn
↓
→ đây mới là "bất biến" đúng nghĩa
⚠ Cấu hình:
gcloud storage buckets update gs://ho-so-benh-nhan \
--retention-period=10y
gcloud storage buckets update gs://ho-so-benh-nhan \
--lock-retention-period
↓
⚠ Lệnh thứ hai là MỘT CHIỀU
⚠ KHÔNG có cách nào hoàn tác
↓
→ phải chắc chắn về con số 10 năm
TRƯỚC KHI khoá
⚠ Vì sao IAM một mình không đủ:
Gỡ quyền storage.objects.delete
↓
⚠ Nhưng ai có quyền IAM
TỰ CẤP LẠI được
⚠ Chủ project luôn có thể
↓
→ IAM là kiểm soát QUYỀN,
không phải bảo đảm BẤT BIẾN
↓
Kiểm toán viên phân biệt rất rõ
hai điều này
Xem thêm câu #12992 (lô 135): dùng lifecycle rule để chuyển lớp và dọn dẹp. Và #13011 (lô 135): giữ 7 năm bằng cách xuất sang Archive. Bổ sung nhau: lifecycle DỌN DẸP theo tuổi, retention policy CẤM XOÁ trước tuổi — và retention THẮNG lifecycle.
Vì sao các phương án khác sai
-
A (gỡ quyền
storage.objects.deletebằng IAM chi tiết) — đây là phương án gần nhất và có tác dụng thực tế, nhưng quản trị viên tự cấp lại quyền được; nó không phải bảo đảm bất biến mà quy định đòi hỏi. -
B (Object Versioning) — giữ phiên bản cũ khi bị ghi đè hoặc xoá, nhưng các phiên bản đó vẫn xoá được; nó là cơ chế khôi phục, không phải bất biến.
-
C (lifecycle chuyển sang Archive sau một ngày) — chỉ giảm chi phí lưu, không ngăn xoá chút nào.
Ghi nhớ
⚠ Bốn cơ chế của Cloud Storage — bảng phải thuộc: | Cơ chế | Việc | |---|---| | Retention policy | CẤM XOÁ/GHI ĐÈ trước khi đủ tuổi | | Bucket Lock | KHOÁ retention policy — không gỡ được | | Object Versioning | giữ phiên bản cũ — vẫn xoá được | | Lifecycle rule | tự chuyển lớp hoặc XOÁ theo tuổi | | Object hold | giữ MỘT đối tượng vô thời hạn | | Ưu tiên | retention policy THẮNG lifecycle |
Từ khoá nhận diện:
"bất biến, kể cả admin cũng không xoá được" → Bucket Lock "giữ N năm để tuân thủ" → retention policy (+ Bucket Lock nếu bắt buộc) "khôi phục khi lỡ ghi đè" → Object Versioning "tự xoá dữ liệu cũ" → lifecycle rule
Delete"giữ riêng một tệp cho vụ kiện" → object hold
| Bucket Lock — điều PHẢI biết trước khi bấm | Nội dung |
|---|---|
| MỘT CHIỀU | không hoàn tác được, mãi mãi |
| Không rút ngắn được thời gian giữ | chỉ kéo dài thêm được |
| Không xoá được bucket khi còn đối tượng chưa hết hạn | |
| Áp cho MỌI đối tượng trong bucket | cả cũ lẫn mới |
| Vì vậy | dùng BUCKET RIÊNG cho dữ liệu tuân thủ |
| Thử trước | tạo bucket thử với retention ngắn để hiểu hành vi |
| Object hold — bổ sung linh hoạt hơn | Loại |
|---|---|
| Temporary hold | giữ vô thời hạn tới khi gỡ |
| Event-based hold | đồng hồ retention chỉ bắt đầu khi gỡ hold |
| Dùng cho | vụ kiện, điều tra — giữ riêng vài tệp |
| Khác retention policy | áp cho TỪNG đối tượng, không cho cả bucket |
| Kết hợp | retention policy cho mức nền + hold cho ngoại lệ |
| Bức tranh tuân thủ đầy đủ cho hồ sơ y tế | Lớp |
|---|---|
| Bucket riêng cho dữ liệu tuân thủ | |
| Retention policy + Bucket Lock | bất biến |
| Uniform bucket-level access | tắt ACL đối tượng |
| Public Access Prevention | chặn công khai |
| CMEK | nếu quy định đòi tự quản khoá |
| Data Access audit log | ai đã đọc hồ sơ nào |
| Lifecycle chuyển sang Archive | giảm chi phí — không xung đột với retention |
| Chi phí của việc giữ 10 năm | Nội dung |
|---|---|
| Không xoá được | dung lượng chỉ tăng |
| Chuyển sang Archive | giảm mạnh giá lưu |
| ⚠ Phí xoá sớm | Archive tối thiểu 365 ngày — không vấn đề ở đây |
| Retention vẫn cho phép chuyển lớp | hai cơ chế độc lập |
| Ước tính trước | dung lượng sau 10 năm với tốc độ tăng hiện tại |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Retention đã khoá chưa | gcloud storage buckets describe gs://b → retentionPolicy.isLocked | | Thời gian giữ là bao lâu | cùng lệnh trên → retentionPeriod | | Có ai xoá được không | thử xoá một đối tượng chưa hết hạn — phải bị từ chối |
Và một lời cảnh báo cần nói thật rõ trước khi chạy lệnh khoá: Bucket Lock không thể hoàn tác, mãi mãi. Một con số thời gian giữ nhập nhầm — 10 năm thành 100 năm — sẽ khoá bạn với chi phí lưu trữ đó suốt cả thế kỷ, và không có đường lùi nào kể cả qua hỗ trợ của Google. Hãy thử trên một bucket riêng với retention vài phút trước khi làm thật.
A data analytics team loads raw, daily log files from Cloud Storage into a "staging" table in BigQuery. Once the data is loaded, they use a series of SQL (Structured Query Language) scripts to clean, de-duplicate, and join the data, moving the final results into a "production" table.
What is this data processing pattern called?
- A Reverse ETL (Extract, Transform, Load)
- B ETL (Extract, Transform, Load)
- C ELT (Extract, Load, Transform)
- D Streaming Ingestion
Xem giải thích
Đáp án
C — ELT (Extract, Load, Transform — trích xuất, nạp, biến đổi).
Vì sao đúng
Đề mô tả đúng thứ tự của ELT: nạp tệp nhật ký THÔ vào bảng staging trong BigQuery TRƯỚC, rồi mới dùng các script SQL để làm sạch, loại trùng và nối dữ liệu thành bảng production.
⚠ Điểm mấu chốt — biến đổi xảy ra SAU khi nạp, và NGAY TRONG kho:
E — Trích xuất tệp nhật ký từ Cloud Storage
↓
L — NẠP vào bảng STAGING trong BigQuery
↓ (dữ liệu vẫn còn THÔ)
↓
T — Chạy SQL để làm sạch, loại trùng, join
↓
Bảng PRODUCTION
↓
⚠ Biến đổi bằng SQL, TRONG BigQuery
→ đây chính là ELT
⚠ Cấu trúc tầng mà đề mô tả:
STAGING → dữ liệu thô như nguồn
(bản ghi gốc, chạy lại được)
↓
PRODUCTION → đã sạch, đã loại trùng,
đã nối — sẵn sàng dùng
↓
⚠ Thêm một tầng RAW phía trước
là mô hình ba tầng đầy đủ
⚠ Vì sao mô hình này phổ biến với BigQuery:
- Nạp theo lô vào BigQuery MIỄN PHÍ
- BigQuery biến đổi hàng tỉ dòng
nhanh và rẻ
- Giữ được dữ liệu thô ở staging
→ chạy lại khi logic đổi
- Không cần hạ tầng biến đổi riêng
- Đội chỉ cần biết SQL
Xem thêm câu #12958 (lô 134), #12989 và #12993 (lô 135): cùng chủ đề ELT — nhận diện luồng, ưu điểm, khác biệt cơ bản với ETL. Bốn câu hoàn toàn nhất quán. Và #13032 (cùng lô) khoá ETL vì ở đó phải làm sạch trước khi dữ liệu sẵn sàng phân tích.
Vì sao các phương án khác sai
-
B (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 vào staging trước.
-
A (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.
-
D (Streaming Ingestion) — mô tả cách NẠP theo luồng; đề nói tệp nhật ký hằng ngày, tức là theo lô.
Ghi nhớ
⚠ ETL ↔ ELT — bảng phải thuộc: | | ETL | ELT | |---|---|---| | Thứ tự | E → T → L | E → L → T | | Nơi biến đổi | công cụ ngoài | trong kho, bằng SQL | | Dữ liệu thô trong kho | không | có (staging) | | Chạy lại logic mới | trích xuất lại từ nguồn | chạy lại từ staging | | Hợp khi | PII không được vào kho | hầu hết trường hợp | | Công cụ | Dataflow, Data Fusion | BigQuery SQL, Dataform |
Từ khoá nhận diện:
"nạp thô vào staging rồi chạy SQL" → ELT "làm sạch trước khi nạp" → ETL "kho → CRM, công cụ marketing" → Reverse ETL "nạp theo luồng thời gian thực" → streaming ingestion — cách nạp, không phải mô hình "che PII trước khi vào kho" → bắt buộc ETL
| Mô hình ba tầng chuẩn | Tầng |
|---|---|
| Raw / Bronze | y hệt nguồn, không sửa gì |
| Staging / Silver | làm sạch, ép kiểu, LOẠI TRÙNG |
| Production / Mart / Gold | mô hình nghiệp vụ, bảng báo cáo |
| Nguyên tắc | mỗi tầng dựng lại được từ tầng trước |
| Quản lý bằng | Dataform hoặc dbt |
| Loại trùng trong BigQuery — cách làm | Cách |
|---|---|
SELECT DISTINCT |
khi dòng trùng hoàn toàn |
ROW_NUMBER() OVER (PARTITION BY khoa ORDER BY ...) |
giữ bản mới nhất |
QUALIFY |
lọc gọn ngay trên hàm cửa sổ |
MERGE |
cập nhật nếu đã có, chèn nếu chưa |
| Nguyên nhân gốc | nạp lại tệp, Pub/Sub at-least-once |
| Vì sao Dataform hợp với mô hình này | Lý do |
|---|---|
ref() |
khai phụ thuộc giữa các bảng |
assertions |
kiểm thử chất lượng ngay trong pipeline |
| Git | review, lịch sử, quay lui |
| Bảng incremental | chỉ xử lý dữ liệu mới |
| Miễn phí | chỉ trả tiền truy vấn BigQuery |
| Thay thế | dbt cũng chạy tốt |
| Quản trị tầng staging | Việc |
|---|---|
| Phân vùng theo ngày nạp | dễ xoá, dễ chạy lại |
| Chính sách giữ bao lâu | ví dụ 90 ngày rồi xoá phân vùng |
| Quyền hẹp | dữ liệu thô có thể chứa PII |
| Không cho báo cáo đọc trực tiếp | chỉ đọc tầng production |
| Sai lầm | để staging phình vô hạn |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Staging có khớp nguồn không | so số dòng với số dòng trong tệp | | Loại trùng có đúng không | so COUNT(*) và COUNT(DISTINCT khoa) | | Chạy lại có ra cùng kết quả không | kiểm thử tính lặp lại được |
Và một điều nên chốt sớm khi vận hành mô hình này: giữ bảng staging bao lâu. Nó là thứ cho phép bạn chạy lại toàn bộ phép biến đổi khi logic thay đổi — nhưng nếu không có chính sách phân vùng và hạn dùng, nó cũng là thứ âm thầm chiếm phần lớn dung lượng kho sau vài năm.
A new service account is being configured to manage the contents of a specific BigQuery dataset. Its responsibilities include creating new tables, updating schemas, and deleting outdated data.
Which predefined IAM role grants these specific data modification permissions without providing full administrative control over the entire BigQuery environment?
- A BigQuery Data Viewer
- B BigQuery Data Owner
- C BigQuery Admin
- D BigQuery Job User
Xem giải thích
Đáp án
B — BigQuery Data Owner (roles/bigquery.dataOwner).
Vì sao đúng
Trong bốn phương án được đưa ra, đây là vai trò duy nhất cho phép SỬA ĐỔI dữ liệu và cấu trúc (tạo bảng, đổi lược đồ, xoá dữ liệu) mà vẫn giới hạn ở phạm vi DATASET, không phải toàn quyền BigQuery.
⚠ Điểm mấu chốt — loại trừ từng phương án:
BigQuery Data Viewer
→ CHỈ ĐỌC
→ không tạo, không sửa, không xoá ✗
BigQuery Job User
→ chỉ CHẠY JOB
→ không đọc, không ghi bảng nào ✗
BigQuery Admin
→ TOÀN QUYỀN trên CẢ PROJECT
→ chính là thứ đề nói phải tránh ✗
BigQuery Data Owner ← còn lại
→ tạo/sửa/xoá bảng và dữ liệu
→ phạm vi DATASET, không phải project ✓
⚠ dataOwner gồm những gì:
= tất cả quyền của dataEditor
tạo, sửa, xoá BẢNG và VIEW
đọc và ghi DỮ LIỆU
↓
+ quản lý QUYỀN của chính dataset
+ xoá dataset
↓
⚠ Vẫn KHÔNG có quyền trên
dataset khác hay reservation
→ đúng nghĩa "không phải toàn quyền
môi trường BigQuery"
⚠ Cấp đúng phạm vi:
bq add-iam-policy-binding \
--member="serviceAccount:sa@du-an.iam.gserviceaccount.com" \
--role="roles/bigquery.dataOwner" \
du_an:dataset_can_quan_ly
↓
⚠ Cấp trên DATASET, không cấp trên project
Ghi nhớ về chất lượng câu hỏi
Trong thực tế,
roles/bigquery.dataEditormới là vai trò tối thiểu cho đúng ba việc mà đề liệt kê (tạo bảng, đổi lược đồ, xoá dữ liệu) —dataOwnerthêm quyền quản lý IAM của dataset và xoá dataset, vốn không cần thiết.Nhưng
dataEditorKHÔNG có trong bốn phương án, nên trong phạm vi câu hỏi này, B là đáp án đúng duy nhất còn cho quyền sửa đổi.Đối chiếu: câu #12995 (lô 135) và #12975 (lô 134) cùng chủ đề nhưng khoá là
dataEditor— vì ở đódataEditorCÓ trong danh sách phương án. Ba câu không mâu thuẫn: khoá khác nhau vì bộ phương án khác nhau. Quy tắc khi làm bài: chọn phương án hẹp nhất CÓ TRONG DANH SÁCH mà vẫn đủ dùng.
Vì sao các phương án khác sai
-
C (BigQuery Admin) — đây là phương án gần nhất về năng lực, nhưng nó cho toàn quyền trên CẢ PROJECT: mọi dataset, reservation, cấu hình — chính là "toàn quyền quản trị môi trường BigQuery" mà đề loại bỏ.
-
A (BigQuery Data Viewer) — chỉ đọc, không tạo hay xoá được gì.
-
D (BigQuery Job User) — chỉ chạy job, không có quyền trên dữ liệu.
Ghi nhớ
⚠ Các vai trò BigQuery theo mức tăng dần — bảng phải thuộc: | Vai trò | Quyền | |---|---| | bigquery.metadataViewer | thấy tên bảng và lược đồ, KHÔNG đọc dữ liệu | | bigquery.dataViewer | đọc dữ liệu | | bigquery.dataEditor | + tạo, sửa, xoá bảng; ghi dữ liệu | | bigquery.dataOwner | + quản lý QUYỀN dataset, xoá dataset | | bigquery.jobUser | chỉ chạy job (trục riêng) | | bigquery.user | jobUser + tạo dataset mới | | bigquery.admin | toàn quyền cả project |
Từ khoá nhận diện:
"tạo/sửa/xoá bảng, không đụng dataset khác" → dataEditor (nếu có), nếu không thì dataOwner "quản lý ai được vào dataset" → dataOwner "chỉ đọc" → dataViewer "chạy truy vấn" → jobUser (kèm quyền dữ liệu) "Admin cho chắc" → luôn sai trong câu hỏi quyền tối thiểu
| Hai trục quyền của BigQuery — nhắc lại | Trục |
|---|---|
| Quyền DỮ LIỆU | dataViewer / dataEditor / dataOwner — cấp trên DATASET |
| Quyền JOB | jobUser / user — cấp trên PROJECT |
Chạy SELECT |
cần cả hai |
| Chỉ ghi bằng Storage Write API | dataEditor là đủ, không cần jobUser |
| Bẫy | thiếu jobUser → thấy bảng mà không chạy được truy vấn |
| Với SERVICE ACCOUNT — thực hành tốt | Thói quen |
|---|---|
| Một service account cho MỖI ứng dụng | không dùng chung |
| KHÔNG dùng service account mặc định | nó có roles/editor |
| Cấp ở mức DATASET | không cấp ở project |
| Không tạo khoá JSON | dùng danh tính gắn sẵn |
| Rà soát bằng Recommender | hạ vai trò không dùng tới |
| Chiến lược làm bài với câu hỏi quyền | Bước |
|---|---|
| 1 | Liệt kê chính xác các việc đề yêu cầu |
| 2 | Loại các vai trò KHÔNG đủ (thiếu quyền) |
| 3 | Loại các vai trò QUÁ RỘNG (Admin, Owner cấp project) |
| 4 | Chọn cái hẹp nhất CÒN LẠI trong danh sách |
| ⚠ | Đáp án đúng là hẹp nhất TRONG PHƯƠNG ÁN CHO SẴN, không phải hẹp nhất trên đời |
| Kiểm soát chi tiết hơn vai trò | Cách |
|---|---|
| Column-level security | policy tag |
| Row-level security | row access policy |
| Authorized view | chỉ lộ kết quả |
| IAM Deny policy | ngoại lệ cứng |
| Kết hợp | vai trò vừa phải + kiểm soát chi tiết |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai có quyền trên dataset | bq show --format=prettyjson <dataset> → access | | Vai trò gồm permission nào | gcloud iam roles describe roles/bigquery.dataOwner | | Có quyền thừa không | IAM Recommender |
Và một chiến lược làm bài đáng nhớ cho mọi câu hỏi về quyền tối thiểu: đáp án đúng là phương án hẹp nhất CÓ TRONG DANH SÁCH, không phải vai trò hẹp nhất tồn tại. Khi dataEditor không được đưa ra, dataOwner trở thành lựa chọn đúng — nhưng ngoài phòng thi, hãy luôn kiểm tra xem có vai trò hẹp hơn không trước khi cấp.