03 Cấp phát và di chuyển dữ liệu
Hướng dẫn cho người hướng dẫn về module cấp phát ClickHouse và di chuyển dữ liệu — quá trình truyền dữ liệu tự chạy 40 đến 50 phút và profile dbt bị thiếu.
Tài liệu đồng hành của người hướng dẫn cho bài học của học viên 03 Cấp phát và di chuyển dữ liệu.
Thời lượng
Khoảng 60 phút, và cách thời gian đó phân bố quan trọng hơn con số tổng: khoảng 10-15 phút
làm việc trực tiếp (Bước 1 cấp phát service ClickHouse Cloud qua Terraform, khoảng 2-3 phút;
Bước 2 tạo trips_raw, seed dữ liệu tham chiếu về zone, và chạy lần dbt run rỗng đầu tiên,
thêm vài phút nữa) rồi tới 40-50 phút truyền dữ liệu tự chạy (script migration ở Bước 3,
chuyển 50 triệu dòng với tốc độ khoảng 20K dòng/giây).
Đây là yếu tố quan trọng nhất về xếp thời gian trong cả workshop: khi Bước 3 đã bắt đầu,
lớp học không có gì để làm trong gần suốt một giờ. Hãy khởi động nó, rồi nghỉ ở đây, hoặc
dùng khoảng chờ đó cho phần nội dung trình bày của module 02 mà lớp chưa đủ thời gian nói,
hoặc một phiên Q&A trực tiếp về các quyết định trong migration-plan.md của các đối tác.
Đừng xếp giờ nghỉ ở bất kỳ chỗ nào khác trong module này — hãy xếp nó ở đây, một cách có
chủ đích.
Nội dung trình bày
- Lý do của chính module này về việc vì sao lab chuyển dữ liệu bằng một script Python thay vì một connector native: Snowflake không phải là nguồn được ClickPipes hỗ trợ (Kafka, S3, Kinesis và CDC từ Postgres/MySQL thì có; Snowflake thì không), và mọi phương án khác (export qua S3, Snowflake -> Kafka -> ClickHouse) đều đánh đổi một thiết lập ở quy mô lab để lấy hạ tầng chẳng liên quan gì tới bản thân việc migration — một S3 bucket, một IAM role, một cluster Kafka.
- Những điểm mạnh thực sự của script Python, đáng nêu rõ: không cần tài khoản AWS, tự chứa
(cả hai package mới đều nằm trong cùng venv với dbt), có thể tiếp tục lại bằng
--resumedựa trên watermarkmax(pickup_at), và minh bạch đủ để một đối tác có thể đọc phần mapping cột thay vì click qua một wizard trên UI. - Nói thẳng về phương án dành cho production: vượt quá khoảng 500M dòng, hoặc ở những nơi chi phí quét toàn bảng của warehouse là đáng kể, export qua S3 là lựa chọn tốt hơn — export song song, load song song. Script Python là đúng cho quy mô lab, không phải một khuyến nghị phổ quát.
- Giới thiệu trước về khoảng chênh lệch dữ liệu (migration gap) ngay bây giờ, dù module 05 mới là nơi đóng nó lại: producer trên Snowflake vẫn ghi liên tục suốt thời gian Bước 3 chạy, nên ClickHouse bị tụt lại sau Snowflake khoảng bằng đúng độ dài của quá trình truyền. Khoảng chênh lệch đó là điều được dự kiến ở đây, và nó chính là thứ mà bước cutover ở module 05 được thiết kế để đóng lại và đo — hãy nói điều này trước khi có người hỏi liệu 40-50 phút chờ đợi kia có đang "làm mất" dữ liệu hay không.
Các lỗi thường gặp
- Lần
dbt runđầu tiên ở Bước 2 thất bại vớiCould not find profile named 'nyc_taxi_ch'. Không có gì trong lab tự động tạo profile dbtnyc_taxi_chcho ClickHouse, dùdbt_project.ymlyêu cầu nó. Bài học của học viên 03 Cấp phát và di chuyển dữ liệu có đề cập chuyện này: mục "Configure the dbt profile" ở Bước 2 hướng dẫn các đối tác gộp một khốinyc_taxi_ch:vào~/.dbt/profiles.ymlhiện có của họ trước khi lầndbt runnày chạy. Nếu một đối tác bỏ qua hoặc sao chép sai bước đó, hãy chỉ họ quay lại đó thay vì giải thích lại cách xử lý ở đây. - Xác thực Terraform thất bại với
401 Unauthorized. Kiểm traCLICKHOUSE_TOKEN_KEYvàCLICKHOUSE_TOKEN_SECRET— cả hai đều nằm trong ClickHouse Cloud UI tại Settings -> API keys và phải có phạm vi Admin. - Script migration thất bại giữa lúc đang chạy. Chạy lại với
--resume; nó đã watermark theomax(pickup_at)hiện có trong ClickHouse và bỏ qua những dòng đã load, nên việc khởi động lại không bao giờ tạo ra một lần load dở dang không thể khôi phục. - Script migration không kết nối được ngay từ đầu. Xác nhận mọi biến môi trường của
Snowflake và ClickHouse đều đã được đặt (
echo $SNOWFLAKE_ORG $SNOWFLAKE_ACCOUNT $SNOWFLAKE_USER $SNOWFLAKE_PASSWORDvàecho $CLICKHOUSE_HOST $CLICKHOUSE_PASSWORD), rồisource .env && source .clickhouse_statevà thử lại. dbt runthất bại vớiConnection refusedhoặcUnknown host.CLICKHOUSE_HOSTchưa được đặt trong shell hiện tại — chạysource .clickhouse_statetừworkshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/và thử lại.
Các bước reset
- Script migration bị ngắt giữa lúc chạy:
python scripts/02_migrate_trips.py --resumetiếp tục từ watermark thay vì chạy lại toàn bộ quá trình truyền 50M dòng. - Service ClickHouse Cloud cần được dựng lại sạch:
source .env && ./teardown.shtừworkshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/(phá hủy service và container producer ClickHouse nếu cutover đã diễn ra), sau đó chạy lại./setup.sh. Cách này không ảnh hưởng tới phía Snowflake của module 01 — phía đó cóteardown.shriêng trongworkshop_public/snowflake_migration_lab/01-setup-snowflake/. - Reset toàn bộ ở đây rất đắt: một lần migration mới phải trả lại toàn bộ 40-50 phút truyền
dữ liệu. Hãy ưu tiên
--resumehoặc một cách sửa có mục tiêu hơn là teardown toàn bộ, miễn là bản thân service ClickHouse vẫn còn khỏe.
02 Lập kế hoạch và thiết kế
Hướng dẫn cho người hướng dẫn về module lập kế hoạch — vì sao bỏ qua nó làm suy yếu mọi thứ diễn ra sau đó, và cách giữ đúng tiến độ cho một khối 90 phút làm phiếu bài tập.
04 Xây dựng lại pipeline dbt
Hướng dẫn cho người hướng dẫn về việc xây dựng lại pipeline dbt trên ClickHouse — vì sao bảng tổng hợp rỗng không phải là lỗi.