Skip to content
Tayakorn

← คู่มือ Airflow — ทำไมงานหลายขั้นต้องมีคนคุมลำดับ

LEVEL 1 · พื้นฐานที่ใช้ทุกวัน

ติดตั้ง Airflow 3 บน Windows โดยไม่ใช้ Docker

สี่บทที่ผ่านมาสร้างตารางกับวงรอบด้วยมือ บทนี้ลงของจริงที่ทำงานแบบเดียวกัน แล้วเปิดดูว่ามันเอาอะไรขึ้นมาบนเครื่อง · บทที่ 5–8 ผูกรุ่น: ทุกคำสั่งและตัวเลขมาจากแล็บของผู้เขียน — Windows 11 · WSL Ubuntu 26.04 · Airflow 3.3.2 · Python 3.12 (6 ต.ค. 2569)

5.1 ทำไมต้องผ่าน WSL

หน้า Quick Start ในเอกสารทางการเขียนตรง ๆ ว่าผู้ใช้ Windows ต้องใช้ WSL2 · อีกทางคือ Docker Compose ที่เอกสารเตรียมไว้ ซึ่งแยกฐานข้อมูล PostgreSQL · Redis · ตัวรันงานแบบ CeleryExecutor เป็นหลาย container และแนะนำให้ Docker ได้แรมอย่างน้อย 4 GB · เล่มนี้เลือก WSL กับ airflow standalone ที่เปิดทุกส่วนบนเครื่องเดียวด้วยคำสั่งเดียว ชิ้นส่วนน้อยกว่า และบทที่ 15 เปิดดูโปรเซสข้างในได้ตรง ๆ

💡 WSL (Windows Subsystem for Linux) — Linux ที่รันอยู่ใน Windows · พิมพ์ wsl แล้วได้ shell ของ Ubuntu ที่มีโฟลเดอร์บ้านของตัวเอง · ไฟล์ฝั่ง Windows มองเห็นได้ที่ /mnt/c/

5.2 ติดตั้งด้วย uv

💡 uv — ตัวจัดการ Python กับแพ็กเกจ ทำหน้าที่แทน pip และ venv · Quick Start ระบุว่าวิธีติดตั้งที่รองรับคือ pip หรือ uv

# ใน shell ของ WSL (Ubuntu)
curl -LsSf https://astral.sh/uv/install.sh | sh   # uv ลงในโฟลเดอร์บ้าน ไม่ต้องใช้ sudo
export PATH="$HOME/.local/bin:$PATH"

mkdir -p ~/airflow-lab && cd ~/airflow-lab
uv venv --python 3.12 .venv                        # uv ดาวน์โหลด Python 3.12 มาเอง ไม่แตะของระบบ
source .venv/bin/activate
uv pip install "apache-airflow==3.3.2" \
  --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-3.3.2/constraints-3.12.txt"
airflow version

ผลรันจริง

3.3.2

บรรทัดที่ไม่คุ้นคือ --constraint · Airflow เป็นทั้งไลบรารีและแอป จึงเปิดช่วงรุ่นของแพ็กเกจที่มันพึ่งไว้กว้าง หน้า Installation from PyPI เตือนว่า pip install apache-airflow เปล่า ๆ บางครั้งได้ของที่ใช้งานไม่ได้ · ไฟล์ constraint คือรุ่นของทุกแพ็กเกจที่ทดสอบผ่านตอนออก 3.3.2 แยกไฟล์ต่อรุ่น Python — constraints-3.12.txt ต้องคู่กับ venv ที่เป็น 3.12

5.3 กับดักที่เจอจริงระหว่างลง

  1. Ubuntu ไม่มี pip กับ venv และ sudo ขอรหัสผ่าน — Quick Start บอกเองว่าบน Ubuntu ระบบอาจกันไม่ให้ pip ลงของใส่ Python ของระบบ (PEP 668) และทางของเอกสารต้องใช้ sudo apt install · uv ลงในโฟลเดอร์บ้านและดาวน์โหลด Python ของตัวเอง บล็อกข้างบนจึงไม่มี sudo สักบรรทัด
  2. สั่ง WSL จาก Git Bash แล้ว path พัง — Git Bash แปลง /mnt/c/... เป็น C:/Program Files/Git/mnt/c/... ก่อนส่งต่อ · ตั้ง MSYS_NO_PATHCONV=1 นำหน้าคำสั่ง หรือเปิด shell ของ WSL ตรง ๆ
  3. Python ของเครื่องใหม่กว่าที่เล่มทดสอบ — Ubuntu 26.04 มาพร้อม 3.14.4 ซึ่ง 3.3.2 รองรับ แต่ทุกบล็อกในเล่มรันกับ 3.12 · ปักรุ่นด้วย uv venv --python 3.12 แล้วใช้ไฟล์ constraint ของรุ่นเดียวกัน — เปลี่ยนรุ่นต้องเปลี่ยนทั้งสองที่
  4. หน้า login — ปิดได้ แต่ต้องรู้ก่อนว่ามันกันอะไร (หัวข้อถัดไป)

5.4 เปิด standalone — และหน้า login มีไว้กันอะไร

export AIRFLOW_HOME=~/airflow-lab                          # ไม่ตั้ง = ใช้ ~/airflow
export AIRFLOW__CORE__LOAD_EXAMPLES=False                  # ไม่โหลด DAG ตัวอย่างที่มากับ Airflow
export AIRFLOW__CORE__SIMPLE_AUTH_MANAGER_ALL_ADMINS=True  # ← เครื่องทดลองเท่านั้น อ่านข้างล่างก่อนใช้
source ~/airflow-lab/.venv/bin/activate
airflow standalone

ทุกคำสั่ง airflow หลังจากนี้รันใน shell ที่ตั้ง AIRFLOW_HOME และเปิด venv แบบบรรทัดแรกกับบรรทัดที่สี่

ผลรันจริง (คัด 9 บรรทัดจาก 142 บรรทัดแรกของบันทึก จนขึ้น Airflow is ready)

standalone | Starting Airflow Standalone
standalone | Checking database is initialized
standalone | Database ready
api-server | Host: 0.0.0.0:8080
scheduler  | 2026-10-06T08:18:00.075912Z [info     ] Starting the scheduler         [airflow.jobs.scheduler_job_runner.SchedulerJobRunner] loc=scheduler_job_runner.py:1625
triggerer  | 2026-10-06T08:18:00.278009Z [info     ] Starting the triggerer         [airflow.jobs.triggerer_job_runner.TriggererJobRunner] loc=triggerer_job_runner.py:263
dag-processor | 2026-10-06T08:18:00.653643Z [info     ] Checking for new files in bundle dags-folder every 300 seconds [airflow.dag_processing.manager.DagFileProcessorManager] loc=manager.py:424
standalone | Airflow is ready
standalone | Airflow Standalone is for development purposes only. Do not use this in production!

คำนำหน้าบรรทัดมีสี่ชื่อ: scheduler · dag-processor · triggerer · api-server — แบบจำลองของบทที่ 4 มีวงรอบวงเดียว ของจริงแบ่งงานของวงนั้นให้หลายส่วน ใครทำอะไรคือปริศนาของบทที่ 15

ก่อนตั้งบรรทัดที่สามในบล็อก ดูบรรทัด Host: 0.0.0.0:8080 — api-server รับการเชื่อมต่อจากทุกช่องทางเครือข่ายของเครื่องที่มันรันอยู่ ไม่ใช่แค่ตัวเครื่องเอง · บน WSL ที่ตั้งค่าตั้งต้น (โหมด NAT) Windows ส่งต่อพอร์ตนี้ให้แค่ localhost แล็บลองยิงจาก IP ของเครื่องในวง LAN แล้วต่อไม่ได้ · แต่ถ้าเปลี่ยน WSL เป็นโหมด mirrored หรือย้ายไปรันบนเซิร์ฟเวอร์ Linux จริง 0.0.0.0 แปลว่าทุกคนที่ถึง IP นั้นถึงพอร์ตนี้ด้วย · ใครเข้าถึงพอร์ตนี้ได้ ก็กดปุ่ม Trigger · Clear · Delete Dag บนหน้าจอได้ — แก้ตารางของบทที่ 4 ได้ทุกช่อง · ค่าตั้งต้นให้ standalone สร้างผู้ใช้ admin พร้อมรหัสผ่านสุ่ม เก็บในไฟล์ simple_auth_manager_passwords.json.generated ใต้ AIRFLOW_HOME · SIMPLE_AUTH_MANAGER_ALL_ADMINS=True ถอดรั้วนี้ทั้งแผง เอกสารเขียนตรง ๆ ว่าใครที่เปิดหน้าจอได้จะเป็น admin ที่มีสิทธิ์ทุกอย่าง ⇒ ตั้งได้เมื่อแน่ใจว่าไม่มีใครอื่นเข้าถึงพอร์ตนั้น ไม่แน่ใจก็ไม่ต้องตั้ง แล้วเปิดไฟล์รหัสผ่านอ่านเอา

เปิด http://localhost:8080 บนเบราว์เซอร์ฝั่ง Windows ก็เห็นหน้าจอของ Airflow · ปิด standalone ด้วย Ctrl+C

5.5 ใช้เครื่องเท่าไหร่ — และต่างจาก 4 GB ของเอกสารยังไง

free -m                                           # ก่อนเปิด standalone แล้วสั่งซ้ำหลังเปิดจนนิ่ง
cd ~ && du -sh airflow-lab/.venv .local/share/uv/python

ผลรันจริง

# ก่อนเปิด standalone
               total        used        free      shared  buff/cache   available
Mem:            7550         539        6689           3         470        7010
# หลังเปิดจนนิ่ง
               total        used        free      shared  buff/cache   available
Mem:            7550        1430        5708           3         565        6119
# ดิสก์
231M	airflow-lab/.venv
110M	.local/share/uv/python
  • แรม: WSL ทั้งก้อน 1,430 MB เพิ่มจากก่อนเปิดราว 0.9 GB (ยังไม่มีงานรัน)
  • โปรเซส: 40 โปรเซส — ตัว standalone · สี่ส่วนหลัก (triggerer มีโปรเซสลูกอีกหนึ่ง) · ตัวเสิร์ฟบันทึกสองตัว · และ worker ของ LocalExecutor ที่ว่างรองาน 32 ตัว (เท่ากับค่า [core] parallelism)
  • ดิสก์: venv กับ Python 3.12 รวมราว 340 MB · ตารางทั้งหมดอยู่ในไฟล์ SQLite airflow.db ใต้ AIRFLOW_HOME

⚠️ อย่าวัดด้วยการบวก RSS ของทุกโปรเซส — 40 โปรเซสบวกกันได้ 5,230 MB เกือบสี่เท่าของที่ WSL ใช้จริง เพราะ RSS นับหน่วยความจำที่หลายโปรเซสใช้ร่วมกันซ้ำทุกโปรเซส · แล็บนับอีกรอบแบบ PSS ซึ่งหารส่วนที่ใช้ร่วมกันให้ทุกโปรเซส ได้ราว 970 MB ใกล้กับส่วนที่ used เพิ่มขึ้น · ตัวเลขที่เชื่อได้คือ used ของ free ก่อนเทียบหลัง

หน้า Prerequisites แนะนำแรมอย่างน้อย 4 GB และเขียนต่อทันทีว่าความต้องการจริงขึ้นกับรูปแบบการติดตั้ง · 1.4 GB ของเราคือเครื่องทดลองเปล่าบน SQLite — บอกได้ว่าลงแล็บไหว แต่ประมาณเครื่องที่รันงานจริงไม่ได้

ลองตอบโดยไม่ย้อนกลับไปอ่าน (เฉลยท้ายเล่ม)

  1. เพื่อนลงบน Ubuntu ที่มี Python 3.13 และไม่มีสิทธิ์ sudo · คำสั่งในหัวข้อ 5.2 ต้องเปลี่ยนตรงไหน ถ้าเขาอยากใช้ 3.13 ของเครื่อง และถ้าเขาอยากได้ผลตรงกับเล่มทุกบรรทัด
  2. บทที่ 1 บอกว่าความรู้ว่างานทำถึงไหนต้องอยู่นอกตัวงาน และบทที่ 4 วางตารางไว้บนดิสก์ — ในเครื่องทดลองนี้ตารางอยู่ที่ไหน และถ้ากด Ctrl+C ปิด standalone แล้วเปิดใหม่ รอบที่จบไปแล้วจะหายไหม
  3. ทำไมการตั้ง SIMPLE_AUTH_MANAGER_ALL_ADMINS=True บนเครื่องที่คนอื่นเข้าถึงพอร์ต 8080 ได้ ถึงร้ายกว่าแค่ "มีคนแอบดูหน้าจอ"

Read the full book