03 จัดเตรียมและย้ายข้อมูล
คู่มือผู้สอนสำหรับโมดูลการจัดเตรียม ClickHouse และการย้ายข้อมูล — การถ่ายโอนแบบไม่ต้องเฝ้า 40 ถึง 50 นาที และโปรไฟล์ dbt ที่ขาดไป
คู่มือประกอบสำหรับผู้สอนของบทเรียนผู้เรียน 03 จัดเตรียมและย้ายข้อมูล
การจัดเวลา
รวมประมาณ 60 นาที และรูปทรงของเวลาสำคัญกว่าตัวเลขรวม: ราว 10-15 นาที
เป็นงานที่ต้องลงมือทำ (ขั้นตอนที่ 1 จัดเตรียมบริการ ClickHouse Cloud ผ่าน Terraform ราว
2-3 นาที ขั้นตอนที่ 2 สร้าง trips_raw หยอดข้อมูลอ้างอิงโซน และรัน
dbt run ครั้งแรกที่ยังว่างเปล่า อีกไม่กี่นาที) ตามด้วยการถ่ายโอนข้อมูลแบบไม่ต้องเฝ้า
40-50 นาที (สคริปต์ย้ายข้อมูลของขั้นตอนที่ 3 ซึ่งย้าย 50 ล้านแถวที่ราว 20K แถวต่อวินาที)
นี่คือข้อเท็จจริงด้านการจัดตารางที่สำคัญที่สุดเพียงข้อเดียวในเวิร์กช็อปทั้งหมด: เมื่อขั้นตอนที่ 3
เริ่มแล้ว จะไม่มีอะไรให้ห้องทำเป็นเวลาเกือบหนึ่งชั่วโมง เริ่มมัน
แล้วพักที่จุดนี้ หรือใช้ช่วงรอกับเนื้อหาแนวการบรรยายของโมดูล 02 ที่ห้อง
ยังไม่มีเวลาฟัง หรือช่วงถาม-ตอบสดเกี่ยวกับการตัดสินใจใน migration-plan.md ของพาร์ตเนอร์ อย่า
จัดช่วงพักไว้ที่อื่นในโมดูลนี้ — จัดไว้ที่นี่ อย่างตั้งใจ
แนวการบรรยาย
- เหตุผลของโมดูลนี้เองว่าเหตุใดแล็บนี้จึงย้ายข้อมูลด้วยสคริปต์ Python แทนที่จะใช้ ตัวเชื่อมต่อดั้งเดิม: Snowflake ไม่ใช่แหล่งข้อมูลต้นทางที่ ClickPipes รองรับ (Kafka, S3, Kinesis และ CDC ของ Postgres/MySQL รองรับ แต่ Snowflake ไม่) และทางเลือกทุกทาง (การส่งออกไปยัง S3, Snowflake -> Kafka -> ClickHouse) แลกการตั้งค่าระดับแล็บกับโครงสร้างพื้นฐาน ที่ไม่เกี่ยวกับตัวการย้ายข้อมูลเลย — บักเก็ต S3 หนึ่งอัน บทบาท IAM หนึ่งบทบาท คลัสเตอร์ Kafka หนึ่งคลัสเตอร์
- จุดขายจริงของสคริปต์ Python ที่คุ้มค่าจะระบุออกมาให้ชัด: ไม่ต้องมีบัญชี AWS
เป็นระบบที่จบในตัวเอง (แพ็กเกจใหม่ทั้งสองอยู่ใน venv เดียวกับ dbt) ทำต่อจากที่ค้างได้
ผ่าน
--resumeโดยอ้างจุดอ้างอิงmax(pickup_at)และโปร่งใสพอที่ พาร์ตเนอร์จะอ่านการแมปคอลัมน์ได้ แทนที่จะคลิกผ่านตัวช่วยแบบ UI - ระบุทางเลือกสำหรับระบบจริงอย่างตรงไปตรงมา: เมื่อเกินราว 500M แถว หรือในกรณีที่ ต้นทุนของ warehouse จากการสแกนทั้งตารางมีความสำคัญ การส่งออกไปยัง S3 เป็นทางเลือกที่ดีกว่า — ส่งออก แบบขนาน โหลดแบบขนาน สคริปต์ Python เหมาะกับขนาดระดับแล็บ ไม่ใช่คำแนะนำ ที่ใช้ได้ทุกกรณี
- เกริ่นถึงช่องว่างของการย้ายข้อมูลตั้งแต่ตอนนี้ แม้ว่าโมดูล 05 จะเป็นตัวปิดมัน: producer บน Snowflake เขียนข้อมูลต่อเนื่องตลอดเวลาที่ขั้นตอนที่ 3 รัน ดังนั้น ClickHouse จึงตามหลัง Snowflake อยู่ ราวเท่ากับความยาวของการถ่ายโอน ช่องว่างนั้นเป็นเรื่องที่คาดไว้แล้วในจุดนี้ และเป็นสิ่งที่ cutover ของโมดูล 05 ถูกสร้างขึ้นมาเพื่อปิดและวัดโดยเฉพาะ — พูดเรื่องนี้ก่อนที่จะมีใครถาม ว่าการรอ 40-50 นาทีนั้น "ทำให้ข้อมูลสูญเปล่า" หรือไม่
ปัญหาที่พบบ่อย
dbt runครั้งแรกในขั้นตอนที่ 2 ล้มเหลวด้วยCould not find profile named 'nyc_taxi_ch'ไม่มีอะไรในแล็บที่สร้างโปรไฟล์ dbtnyc_taxi_chของ ClickHouse ให้โดยอัตโนมัติ แม้ว่าdbt_project.ymlจะต้องใช้มัน บทเรียนของผู้เรียน 03 จัดเตรียมและย้ายข้อมูล ครอบคลุมเรื่องนี้: หัวข้อ "Configure the dbt profile" ของขั้นตอนที่ 2 พาพาร์ตเนอร์ผ่านการผสาน บล็อกnyc_taxi_ch:เข้าไปใน~/.dbt/profiles.ymlที่มีอยู่ก่อนที่dbt runนี้ จะรัน หากพาร์ตเนอร์ข้ามหรือคัดลอกขั้นตอนนั้นผิด ให้ชี้พวกเขากลับไปที่ตรงนั้น แทนที่จะ อธิบายวิธีแก้ซ้ำที่นี่- การยืนยันตัวตนของ Terraform ล้มเหลวด้วย
401 UnauthorizedตรวจสอบCLICKHOUSE_TOKEN_KEYและCLICKHOUSE_TOKEN_SECRET— ทั้งคู่อยู่ใน ClickHouse Cloud UI ใต้ Settings -> API keys และต้องมีขอบเขตสิทธิ์ Admin - สคริปต์ย้ายข้อมูลล้มเหลวกลางทาง รันใหม่ด้วย
--resumeมันทำจุดอ้างอิงจากmax(pickup_at)ที่มีอยู่แล้วใน ClickHouse และข้ามแถวที่โหลดไปแล้ว ดังนั้นการเริ่มใหม่ จะไม่เคยทำให้เกิดการโหลดที่ไม่สมบูรณ์และกู้คืนไม่ได้ - สคริปต์ย้ายข้อมูลเชื่อมต่อไม่ได้เลย ยืนยันว่าตัวแปรสภาพแวดล้อมของ Snowflake และ
ClickHouse ทุกตัวถูกตั้งค่าไว้ (
echo $SNOWFLAKE_ORG $SNOWFLAKE_ACCOUNT $SNOWFLAKE_USER $SNOWFLAKE_PASSWORDและecho $CLICKHOUSE_HOST $CLICKHOUSE_PASSWORD) แล้วsource .env && source .clickhouse_stateและลองใหม่ dbt runล้มเหลวด้วยConnection refusedหรือUnknown hostCLICKHOUSE_HOSTยัง ไม่ได้ถูกตั้งค่าในเชลล์ปัจจุบัน —source .clickhouse_stateจากworkshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/แล้วลองใหม่
ขั้นตอนการรีเซ็ต
- สคริปต์ย้ายข้อมูลถูกขัดจังหวะ:
python scripts/02_migrate_trips.py --resumeจะทำต่อ จากจุดอ้างอิง แทนที่จะเริ่มการถ่ายโอน 50M แถวใหม่ทั้งหมด - บริการ ClickHouse Cloud ต้องการการสร้างใหม่ให้สะอาด:
source .env && ./teardown.shจากworkshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/(ทำลายบริการ และคอนเทนเนอร์ producer ของ ClickHouse หาก cutover เกิดขึ้นแล้ว) แล้ว./setup.shอีกครั้ง วิธีนี้ไม่แตะฝั่ง Snowflake ของโมดูล 01 — ฝั่งนั้นมีteardown.shของตัวเองอยู่ในworkshop_public/snowflake_migration_lab/01-setup-snowflake/ - การรีเซ็ตทั้งหมดมีต้นทุนสูงในจุดนี้: การย้ายข้อมูลใหม่ต้องจ่ายเวลาถ่ายโอน 40-50 นาที
ทั้งหมดอีกครั้ง เลือกใช้
--resumeหรือการแก้ไขแบบเจาะจงแทนการรื้อถอนทั้งหมด เมื่อ ตัวบริการ ClickHouse เองยังทำงานได้ดีอยู่