04 สร้างไปป์ไลน์ dbt ขึ้นใหม่
คู่มือผู้สอนสำหรับการสร้างไปป์ไลน์ dbt ขึ้นใหม่บน ClickHouse — เหตุใดตารางสรุปที่ว่างเปล่าจึงไม่ใช่บั๊ก
คู่มือประกอบสำหรับผู้สอนของบทเรียนผู้เรียน 04 สร้างไปป์ไลน์ dbt ขึ้นใหม่
การจัดเวลา
ประมาณ 30 นาที ช่วงเดียวที่มีเวลาว่างจริงคือ dbt run ครั้งที่สองในขั้นตอนที่ 1
(ราว 8-12 นาทีในการประมวลผล 50 ล้านแถวผ่านโมเดล incremental) — สั้น
พอที่มักไม่จำเป็นต้องมีช่วงพักของตัวเอง แต่ยาวพอที่ควรบรรยายไปด้วยมากกว่า
จะเฝ้าดูอย่างเงียบ ๆ ขั้นตอนที่ 2 (dictionary ของโซน) และคำสั่งค้นหาเพื่อตรวจสอบนั้น
รวดเร็วและมีการโต้ตอบ
แนวการบรรยาย
- วางกรอบโมดูลนี้ว่าเป็นการพิสูจน์ไปป์ไลน์ ไม่ใช่ข้อมูล: โมดูล 03 พิสูจน์แล้วว่า ClickHouse รองรับ 50 ล้านแถวได้ โมดูลนี้พิสูจน์ว่าไปป์ไลน์ Medallion แบบเดียวกันจากโมดูล 01 — staging view, ตาราง fact แบบ incremental, การโหลดมิติซ้ำ, การทดสอบ — ทำงานบน ClickHouse ได้โดยรูปทรงไม่เปลี่ยน
- กลไก dbt หนึ่งอย่างที่คุ้มค่าจะหยุดพูดถึง:
delete_insertมาแทนMERGE INTO(ClickHouse ไม่มีคำสั่งMERGE) และReplacingMergeTreeเป็นตัวรองรับความปลอดภัย อยู่ข้างใต้ ไม่ใช่ตัวแทนของมัน — หากdelete_insertทำงานเสร็จตามปกติจะไม่มี อะไรให้ RMT มาเก็บกวาด มันมีความสำคัญเฉพาะเมื่อการรันถูกขัดจังหวะกลางทาง mv_live_trip_feedคุ้มค่าที่จะเรียกชื่อออกมาให้ชัด: มันไม่มีสิ่งที่เทียบเท่าบน Snowflake เลย materialized view แบบมาตรฐานเห็นแต่แถวในชุดข้อมูลที่กระตุ้นให้มันทำงาน ส่วน materialized view แบบ REFRESHABLE รันคำสั่งค้นหาทั้งหมดใหม่ตามกำหนดเวลา จึงสามารถ ดูแลค่าสรุปตลอดอายุการใช้งานได้ นี่เป็นความสามารถใหม่ที่การย้ายข้อมูลเพิ่มเข้ามา ไม่ใช่การ ย้ายแบบตรง ๆ- พูดเรื่องนี้ก่อนที่จะมีใครถาม:
agg_hourly_zone_tripsจะว่างเปล่าหลังdbt runของขั้นตอนที่ 1 และนั่นถูกต้องแล้ว ไม่ใช่บั๊ก ตัวกรอง incremental ของมันคือWHERE pickup_at >= now() - INTERVAL 2 HOURซึ่งตรงกับแถวที่เขียนโดย producer ที่ทำงานสด เท่านั้น ทุกแถวที่เพิ่งย้ายมาล้วนเป็นข้อมูลย้อนหลัง มันจะว่างเปล่าไปจนกว่าโมดูล 05 จะเริ่ม producer ของ ClickHouse ตอน cutover พาร์ตเนอร์มักคิดว่านี่คือไปป์ไลน์ที่พังอยู่เสมอ — ตัดหน้าคำถามนี้ไว้ก่อน
ปัญหาที่พบบ่อย
agg_hourly_zone_tripsคืนค่า 0 แถวหลังขั้นตอนที่ 1 และพาร์ตเนอร์รายงานว่าเป็น บั๊ก มันไม่ใช่ — ดูแนวการบรรยายด้านบน ยืนยันว่าdim_taxi_zones(265 แถว) และfact_trips(ราว 50 ล้านแถว) มีข้อมูลตามที่คาดไว้ ก่อนที่จะเสียเวลา กับagg_hourly_zone_tripsหากสองตารางนั้นถูกต้อง ตารางสรุปที่ว่างเปล่าก็ ทำงานตรงตามที่ออกแบบไว้ นี่คือปัญหาหลักของโมดูลนี้ — คาดว่าจะมี คำถามนี้ทุกครั้งdbt runในขั้นตอนที่ 1 ล้มเหลวหรือเชื่อมต่อไม่ได้ โมดูลนี้ขึ้นอยู่กับโปรไฟล์ dbt ของ ClickHouse ที่โมดูล 03 ควรจะสร้างไว้แล้ว (~/.dbt/profiles.yml,nyc_taxi_ch) หากโปรไฟล์นั้นหายไป — ดูหัวข้อ "Configure the dbt profile" ของขั้นตอนที่ 2 ใน 03 จัดเตรียมและย้ายข้อมูล — ขั้นตอนที่ 1 จะล้มเหลวที่นี่แทน ซึ่งช้ากว่าต้นตอของปัญหาไปหนึ่งโมดูล- TODO: หัวข้อ
## dbt on ClickHouseของหน้า การแก้ปัญหา บนไซต์ ยังไม่มีรายการเฉพาะสำหรับความผิดพลาดที่ปรากฏขึ้น เฉพาะในขั้นตอนนี้ บันทึกสิ่งที่พบจากการซ้อมไว้ที่นี่
ขั้นตอนการรีเซ็ต
- รัน
dbt runซ้ำได้ตามสะดวก — มันเป็นแบบ incremental และปลอดภัยที่จะทำซ้ำ ไม่มีอะไรที่นี่ต้อง รื้อถอน - หลังเปลี่ยนโมเดลหรือสคีมาของ dbt ให้บังคับสร้างโมเดล incremental ขึ้นใหม่ทั้งหมด:
dbt run --full-refresh(จากworkshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/dbt/nyc_taxi_dbt_ch) - หาก dictionary ของโซนดูผิดหรือเก่า ก็เพียงรัน
scripts/04_create_dictionary.sqlใหม่ — มันเป็นCREATE OR REPLACE DICTIONARYซึ่งปลอดภัยที่จะรันซ้ำโดยไม่ต้องลบอะไร ก่อน - ไม่มีการรีเซ็ตระดับสภาพแวดล้อมที่ใช้ที่นี่ — การรื้อถอนของโมดูลนี้คือ
workshop_public/snowflake_migration_lab/03-migrate-to-clickhouse/teardown.shตัวเดียวกับที่กล่าวถึง ในโมดูล 03 อย่ารันมันระหว่างที่โมดูลนี้ยังดำเนินอยู่
03 จัดเตรียมและย้ายข้อมูล
คู่มือผู้สอนสำหรับโมดูลการจัดเตรียม ClickHouse และการย้ายข้อมูล — การถ่ายโอนแบบไม่ต้องเฝ้า 40 ถึง 50 นาที และโปรไฟล์ dbt ที่ขาดไป
05 ทำเบนช์มาร์กและ cutover
คู่มือผู้สอนสำหรับการทำเบนช์มาร์กและ cutover — การปิดช่องว่างแบบสองรอบ ข้อควรระวังในการนำเข้าแดชบอร์ด และลำดับการรื้อถอน