P
PipeCraft

Roadmap Progress

ข้อมูลเบื้องต้นเกี่ยวกับวิศวกรรมข้อมูล (Introduction to Data Engineering) Python สำหรับ Data Engineering พื้นฐาน Linux & CLI สำหรับวิศวกรข้อมูล Git สำหรับระบบงานข้อมูลและทีมพัฒนา ระบบเครือข่ายและระบบประมวลผลแบบกระจายศูนย์ (Networking & Distributed Systems) SQL ขั้นสูง (Window Functions & Optimization) ฐานข้อมูลไม่ใช่เชิงสัมพันธ์ (NoSQL Databases & Modern Stores) การออกแบบโครงสร้างข้อมูล (Star/Snowflake & SCD) โครงสร้างพื้นฐานเครือข่ายระบบคลาวด์ (Cloud-based Networking) สถาปัตยกรรม Data Lakehouse (Apache Iceberg & MinIO) Local-first Data Engineering ด้วย DuckDB โครงสร้างพื้นฐานในรูปแบบโค้ด (IaC ด้วย Terraform) การแปลงข้อมูลระดับโปรด้วย dbt-core ข้อตกลงร่วมด้านข้อมูล (Data Contracts) การบริการและการส่งต่อข้อมูลวิเคราะห์ (Data Serving & Reverse ETL) การประมวลผลข้อมูลขนาดใหญ่แบบกระจายด้วย Apache Spark ระบบจัดการเวิร์กโฟลว์ข้อมูล (Airflow, Dagster & Prefect) การประมวลผลข้อมูลแบบเรียลไทม์ด้วย Kafka & Redpanda การจัดการคอนเทนเนอร์และคลัสเตอร์ (Containers & Kubernetes) ระบบ CI/CD และการเฝ้าระวังคุณภาพข้อมูล (CI/CD, Monitoring & Testing) ระบบความปลอดภัยและการควบคุมข้อมูล (Security, Governance & Privacy) ระบบปฏิบัติการและประมวลผลโมเดล (Machine Learning & MLOps)
บทที่ 5: ระบบประมวลผลขนาดใหญ่และการจัดลำดับงาน (Orchestration, Scale & Streaming)

ระบบ CI/CD และการเฝ้าระวังคุณภาพข้อมูล (CI/CD, Monitoring & Testing)

5.5 ระบบ CI/CD การทดสอบ และการเฝ้าระวังคุณภาพข้อมูล

การรันระบบโปรดักชันวิศวกรรมข้อมูลจำต้องมั่นใจในความถูกต้องของโค้ด และประสิทธิภาพฮาร์ดแวร์ล่วงหน้าผ่านด่านตรวจสอบอัตโนมัติและแดชบอร์ดTelemetry

1. ด่านตรวจสอบความเข้ากันได้ และการตรวจสอบจำลองการรันระบบ (SQL Linting & Dry-Runs)

ทฤษฎีและกลไกการทำงาน (How it works): ในการพัฒนาโปรเจกต์ท่อส่งข้อมูลขนาดใหญ่ เราต้องมั่นใจว่าไม่มีโค้ด SQL ที่จัดรูปแย่ หรือไวยากรณ์เออเร่อหลุดลอยขึ้นระบบหลัก ด่านตรวจสอบ CI จะเริ่มจากการรันเครื่องมือ **SQL Linting (เช่น SQLFluff)** ตรวจกฎไวยากรณ์ และรันโปรเซสจำลองแก้ไขสกีมาแบบแห้ง **Dry-Run** (ยิงเช็คแผนการคอมไพล์บนฐานข้อมูลจริงโดยไม่เขียนข้อมูลลงดิสก์) เพื่อดักเออเร่อ

# GitHub Actions CI workflow snippet executing SQLFluff linter checks
name: Data Pipeline CI

on: [push, pull_request]

jobs:
  lint-and-validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install SQLFluff and Lint SQL Files
        run: |
          pip install sqlfluff
          sqlfluff lint models/ --dialect bigquery
                    

Use Case ในชีวิตจริง (Real-world Scenario): มีนักพัฒนาเผลอพิมพ์คอมม่าเกินหรือพิมพ์คำสั่งเชื่อม SQL ตกหล่น ระบบ CI ของบริษัทจะดักจับเจอจุดพังตั้งแต่จังหวะเปิด Pull Request ทำให้บล็อกข้ามข้อบกพร่องไม่ให้ปนเปื้อนเข้าโปรเจกต์หลัก

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การเช็ค Dry-Run ในบางฐานข้อมูลคลาวด์อาจมีค่าใช้จ่ายแฝงจากการดึงข้อมูล Metadata แก้ไขโดยเปิดใช้ระบบจดสิทธิ์จำพวก Local Schema Emulator ในขั้นตอนการตรวจสอบ CI

2. ยุทธวิธีการส่งมอบและการสลับระบบแบบไร้รอยต่อ (Blue-Green Deployments)

ทฤษฎีและกลไกการทำงาน (How it works): เพื่อหลีกเลี่ยงระบบสืบค้นข้อมูลล่มระหว่างปรับปรุงระบบวิศวกรรมข้อมูลจะนำเทคนิค **Blue-Green Deployment** มาใช้งาน: - **Blue Environment**: สภาพแวดล้อมระบบเดิมที่กำลังเปิดบริการอ่านข้อมูลให้แดชบอร์ดตามปกติ - **Green Environment**: สภาพแวดล้อมสเปคใหม่ที่ถูกติดตั้งไว้ข้างกัน และทำการคำนวณเขียนตารางเสร็จสิ้น เมื่อระบบ Green ประมวลผลและทดสอบผ่าน สัญญาสิทธิ์ชี้เป้าจะสลับชี้พอร์ต (Schema redirection) สลับดึงไปที่ตาราง Green ทันที ช่วยให้ปลายทางไม่พบปัญหาโหลดค้าง

-- SQL demonstrating seamless blue-green schema swapping via aliases
CREATE OR REPLACE VIEW analytical_marts.active_sales_mart AS 
SELECT * FROM analytical_marts.sales_mart_green; -- Swap reference to updated green table
                    

Use Case ในชีวิตจริง (Real-world Scenario): ตารางสรุปพฤติกรรมลูกค้าที่ใช้อ่านข้อมูลหน้าเว็บหลัก สลับสิทธิ์วิวไปหาตารางใหม่ที่เพิ่งอัปเดต โดยลูกค้าหน้าเว็บตรวจไม่พบระยะเวลาหยุดชะงักของบริการเลย

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การสลับ Green สวนทางไปในขณะที่ยังมีคิวรีค้างคาในตาราง Blue ซึ่งอาจส่งผลให้คำสั่งอ่านล้มเหลว แก้ไขโดยตั้งเวลากวาดล้างและยกเลิกขีดเขียนตาราง Blue หลังจากสลับวิวไปแล้ว 30 นาที

3. การจัดเก็บสถิติระบบและรายงานแดชบอร์ดด้วย Prometheus และ Grafana

ทฤษฎีและกลไกการทำงาน (How it works): ระบบเฝ้าระวังประสิทธิภาพฮาร์ดแวร์ทำงานโดยใช้ **Prometheus** สแกนดึงสถิติตามพอร์ตวิเคราะห์ (Metrics Scraping) เช่น ข้อมูลเปอร์เซ็นต์ RAM, อัตราดิสก์เต็ม, และเวลารันจ๊อบเฉลี่ยของ Airflow/Spark จากนั้นนำประวัติข้อมูลไปพล็อตสรุปภาพจัดเรียงบนกราฟแดชบอร์ด **Grafana** เพื่อช่วยอำนวยความสะดวกในการตรวจจับคอขวดระบบงาน

# Prometheus scraping configuration script for monitoring targets
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'pipecraft-airflow'
    static_configs:
      - targets: ['airflow-statsd-exporter:9102']
  - job_name: 'spark-executors'
    static_configs:
      - targets: ['spark-master:4040']
                    

Use Case ในชีวิตจริง (Real-world Scenario): แดชบอร์ดตรวจสอบสุขภาพระบบพล็อตสถิติการรันจ๊อบ Spark และแจ้งเตือนทีมวิศวกรวิล่วงหน้าเมื่อพบอัตราการกินแรมไต่สูงเกือบเต็มพิกัดโหนด เพื่อส่งทีมวิศวกรเข้าไปช่วยแก้ไขขนาดคลัสเตอร์ก่อนเครื่องจริงจะหยุดทำงาน

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): สถิติ Prometheus บวมโตและกินดิสก์เซิร์ฟเวอร์จนเกือบเต็ม แก้ไขโดยเปิดใช้งานนโยบายจำกัดวันกักเก็บสถิติเก่าล่วงหน้า (Metrics Retention Policy เช่น เก็บประวัตินานเพียง 30 วัน)

4. การตรวจสอบคุณภาพข้อมูลในเลเยอร์การส่งออก (Data Quality Observability)

ทฤษฎีและกลไกการทำงาน (How it works): ระบบ **Data Quality Observability** ทำหน้าที่วิเคราะห์ลึกกว่าเรื่องความพังของเซิร์ฟเวอร์ โดยจะเข้าไปเฝ้าตรวจนิ่งของตัวเลขข้อมูลดิบ (เช่น จำนวนเรคคอร์ดนำเข้าเฉลี่ยรายวัน, อัตราส่วนฟิลด์ที่เป็น Null, หรือความเบี่ยงเบนของสถิติค่าสูงสุด/ต่ำสุด) เพื่อดักระแสตรรกะข้อมูลเพี้ยน

# Python logic checking raw data quality metrics using Soda SQL / Great Expectations
from great_expectations.dataset import PandasDataset

def validate_dataframe(df):
    ge_df = PandasDataset(df)
    # Define rules: amount column values must be positive and non-null
    res = ge_df.expect_column_values_to_be_between(column="amount", min_value=0.0)
    if not res["success"]:
        raise ValueError("Data Quality Check Failed: Negative sales volumes detected!")
                    

Use Case ในชีวิตจริง (Real-world Scenario): มีโปรแกรมเมอร์ต้นทางแก้ไขโค้ดแอปและยิงข้อมูลยอดเงินซื้อส่งเป็นค่า 0 ดักจับความเบี่ยงเบนระบบ Observability จะสแกนเจอค่าเฉลี่ยตารางลดลงฮวบ และสั่งยกเลิกเพื่อความปลอดภัยของสถิติรายงานธุรกิจ

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การรันระบบทดสอบคัดกรองข้อมูลดิบขนาดใหญ่ทุกล็อตรันหน่วงเวลาจ๊อบยาวเกินไป แก้ไขโดยสุ่มประเมินเฉพาะส่วนแบ่งกลุ่มประชากร (Statistical sampling validation) ในขั้นตอนนี้

5. การวางโครงสร้างเตือนภัยอัตโนมัติ (PagerDuty & Slack Webhooks)

ทฤษฎีและกลไกการทำงาน (How it works): เมื่อเกิดกรณีท่อข้อมูลระดับโปรดักชันล่มกลางคัน ระบบต้องการโครงสร้างเตือนภัยอัตโนมัติ โดยยิงส่งรายละเอียดจุดพังผ่าน **Slack Webhooks** หรือส่งสัญญาณด่วนไปปลุกวิศวกรผู้เข้าเวร (On-Call Engineer) ผ่าน **PagerDuty** โค้ดแจ้งเตือนต้องแนบรหัสข้อผิดพลาดและลิงก์ประวัติล็อกเพื่อประกอบการแก้ไขปัญหาเบื้องต้น

# Python script to send structured alerts to a Slack Webhook on pipeline failures
import requests

def send_pipeline_alert(webhook_url, job_name, error_message):
    alert_payload = {
        "text": f"🚨 *DATA PIPELINE INCIDENT DETECTED* 🚨",
        "attachments": [{
            "color": "danger",
            "fields": [
                {"title": "Failed Job", "value": job_name, "short": True},
                {"title": "Severity", "value": "CRITICAL / P1", "short": True},
                {"title": "Error Stack", "value": error_message, "short": False}
            ]
        }]
    }
    requests.post(webhook_url, json=alert_payload)
                    

Use Case ในชีวิตจริง (Real-world Scenario): ท่อส่งสรุปรายงานเงินเดือนพังทลายเนื่องจากฐานข้อมูลธนาคารต้นทางตัดเน็ตเวิร์ก โครงสร้างเตือนภัยจะสั่งปลุกวิศวกรออนคอลเพื่อกู้ภัยได้ภายใน 10 นาที

ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): สภาวะการแจ้งเตือนถี่เกินไปจนวิศวกรเลิกสนใจ (Alert fatigue) แก้ไขโดยตั้งจัดระดับความสำคัญ (Severity levels) ส่งวิจารณ์ PagerDuty ปลุกคนเฉพาะ P1 (Critical) ส่วน P3 (Warning) ให้รายงานเข้า Slack

🛠️ Weekend Sandbox Challenge: Build a Data Quality Check validation in CI

โจทย์ปฏิบัติการ: จงตั้งค่าเขียนขั้นตอนในไฟล์ GitHub Actions Workflow เพื่อทำการสั่งติดตั้งและรันตรวจสอบคุณภาพของข้อมูล (Data Quality Checks) โดยปฏิเสธโค้ดหากไม่ผ่านเกณฑ์การทดสอบคีย์หลัก

# .github/workflows/data_quality_ci.yml
name: Data Quality CI
on: [push]
jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v4
      - name: Run Data quality assertions
        run: |
          pip install great_expectations
          python -m pytest tests/data_tests.py
                    

💼 Senior Technical Interview Q&A

Q1: สัญนิยมความเสถียรข้อมูล (Data Observability) แตกต่างจากการตรวจสอบระบบเซิร์ฟเวอร์แบบ Infrastructure Monitoring ทั่วไปอย่างไร?

A1: Infrastructure Monitoring ตรวจสอบสถานะการเชื่อมต่อ ฮาร์ดแวร์ แรม และโควต้า CPU (เช่น โฮสต์ยังออนไลน์ไหม) ในขณะที่ Data Observability เจาะลึกตรวจสอบสุขภาพของตัวข้อมูล (Data health) เช่น การจับตา Schema Drift, ปริมาณแถวข้อมูลนำเข้าผิดปกติ หรือความเบี่ยงเบนของตัวเลขสถิติ

Q2: จงอธิบายวิธีการออกแบบท่อส่งข้อมูลการส่งมอบและสลับระบบตารางข้อมูลสรุปแบบไร้รอยต่อ (Blue-Green database tables migrations)?

A2: เราจะเตรียมสร้างตารางคู่กัน เช่น `fct_sales_blue` (ตารางเดิมที่แดชบอร์ดกำลังสืบค้นใช้งาน) และ `fct_sales_green` (ตารางใหม่ที่จ๊อบรันอัปเดตสเปคล่าสุด) เมื่อคำนวณและรันเทสบนฝั่ง green สำเร็จ เราจึงยิงคำสั่งเปลี่ยนทิศทางชี้วิว (View Alias Swapping) สลับให้ผู้ใช้อ่านข้อมูลจาก green แทนทันที ไร้ความหน่วง

ข้อดี / จุดเด่น & ข้อเสีย / ข้อควรระวัง

ข้อดี / จุดเด่น

  • มั่นใจว่าโค้ดใหม่จะไม่ทำให้ระบบคลังข้อมูลและท่อประมวลผลข้อมูลหลักเสียหาย
  • รู้ปัญหาเน็ตเวิร์กล่มหรือเครื่องเซิร์ฟเวอร์เต็มก่อนลูกค้าส่งข้อความแจ้งเตือน

ข้อเสีย / ข้อควรระวัง

  • ต้องเขียนไฟล์การทดสอบเพิ่มและดูแลรักษาโครงสร้างทดสอบค่อนข้างบ่อย
  • มีค่าใช้จ่ายเพิ่มเติมจากเวลาคำนวณการประมวลผลรันเครื่องรันระบบ CI/CD

ปฏิบัติการจริง (Lab Practice)

Bilingual Guide

แล็บ: ตั้งค่าท่อทดสอบ GitHub Actions สำหรับโปรเจกต์ข้อมูล

💡 คำแนะนำ & ทริกเด็ด

ในการเฝ้าระวังระบบ ให้ตั้งสัญญาณเตือน (Alert Rule) บน Grafana สำหรับสถิติ Task Failures ของ Airflow ให้เตือนทันที เพื่อแก้ไขข้อขัดข้องก่อนที่ผู้ใช้งานธุรกิจจะเห็นรายงานแดชบอร์ดผิดพลาด