Airflow 2 ปล่อยมาได้สักพักแล้วนะฮะ ถ้าต้องการกลับไปอ่าน Airflow 1 ว่ามีที่มาที่ไปยังไง ทำไมเราควรรู้จักก็กดลิงก์ข้างล่างนี้ได้เลยฮะ

Try Apache Airflow
Apache Airflow is an open-source program under Apache foundation. It allows us to create each step to run in arbitrary sequences and conditions like a flow.

มีอะไรใหม่บ้าง

เท่าที่อ่าน Changelog เนี่ยก็พอสรุปเป็นหัวข้อใหญ่ๆ แบบที่รุ่นเริ่มต้นคนนึงพอสังเกตและคิดว่าดีนะฮะ

UI ใหม่

ของใหม่ ก็ควรมีหน้าตาใหม่ ใช้งานง่ายๆ ขึ้นกว่าเดิม สวยกว่าเดิมสิฮะ

source: https://airflow.apache.org/blog/airflow-two-point-oh-is-here/

TaskFlow API

ใน Airflow 2 มันสามารถใช้ decorator @task เพื่อทำให้อ้างอิงและเรียกใช้ method ง่ายขึ้นแล้ว แต่ตอนนี้ผมยังไม่ได้ลองใช้ feature นี้นะฮะ เดี๋ยวจะเขียนในโอกาสถัดไป

และอื่นๆ

สารภาพว่า ไม่ค่อยได้ใช้ Airflow แบบ geek จ๋ามาก เพราะเน้นใช้งานกับ business value เป็นหลัก เลยไม่ได้ลอง feature ใหม่ อะไรใหม่ของ Airflow 2 มากนัก แค่มัน work กับ legacy code ก็ปลื้มใจมากแล้ว ฮ่าๆ

อ้อ กังหันลมหมุนๆ ได้แล้วด้วยนะ

ถ้าสนใจอ่าน Changelog แบบละเอียด ลองไปตามลิงก์นี้ได้เลยฮะ


ลองเล่นกับ Docker กัน

จากที่เคยเขียนในบล็อกก่อน (ลิงก์ข้างบนนู่น) สมัย Airflow 1 ผมพยายามจะลง Docker official image ใช้มัน แต่ดูเหมือนจะยุ่งยาก เอกสารเขียนแล้วผมอ่านไม่เข้าใจ ดูมี configuration เยอะแยะมากมาย สรุปเลยต้องใช้ของ Puckel's image แทน ซึ่งใช้งานง่ายกว่าเยอะ

แต่ว่า...

ตอนนี้เราสามารถใช้ official ของ Airflow 2 ได้ง่ายมากๆ เลยฮะ ด้วยการใช้ docker compose ที่ Airflow เป็นคนเขียนมาเอง อ้างอิงจากลิงก์นี้ และผมก็ได้ปรับแต่งมันให้เหมาะกับการใช้งานจริงๆ ของผมเอง ตาม repo ด้านล่างนี้เลยฮะ

GitHub - bluebirz/airflow-docker: Docker-compose for local airflow development
Docker-compose for local airflow development. Contribute to bluebirz/airflow-docker development by creating an account on GitHub.

รายละเอียดการแก้ไข

  • เราทำตาม official document ของ Airflow ที่ใช้ docker-compose.yaml ถ้าอยากอ่านเพิ่มเติมว่ามันคืออะไร สามารถไปตามลิงก์นี้ได้เลยฮะ
  • เดิม docker-compose.yaml ของ official จะใช้ image ตั้งต้นของ Airflow แต่เราจะสร้าง dockerfile เป็นของเราเอง เนื่องจากต้องการลง packages เพิ่มเติมได้ง่ายขึ้น ซึ่งเราสามารถกำหนดว่าจะลง packages อะไรบ้างได้ที่requirements.txt และ constraint.txt
  • ไม่เอา sample DAGs โดยกำหนดค่าที่บรรทัด 59 ใน docker-compose.yaml (ถ้าเราเอา ตอนสร้าง container เสร็จแล้ว จะมี DAG มาเพียบเลยฮะ)
  AIRFLOW__CORE__LOAD_EXAMPLES: 'false'
  • สร้าง directory ไว้เรียบร้อยแล้ว ได้แก่ /dags, /logs, /plugins ซึ่งเราจะใช้ /dags เป็นหลักมากกว่า

ได้เวลาลงไม้ลงมือ

0. กำหนด dependency packages

เราใส่รายการ python packages ไว้ที่ไฟล์ requirements.txt และ constraints.txt ซึ่งมันจะติดตั้งให้ตอนเรา build image ในขั้นตอนต่อไปฮะ

จากรูปตัวอย่างข้างล่างเนี่ย ผมเลือกให้ติดตั้ง pysftp

ถ้าไม่แน่ใจว่าจะใช้ตัวไหนบ้าง ก็เช็คได้ที่ https://pypi.org ฮะ

1. docker-compose up

ว่าแล้วเราก็ up มันได้เลยฮธ

docker-compose up

แป๊บเดียวเท่านั้น มันก็จะเริ่ม build image โดย pull image ที่เกี่ยวข้องมาก่อน

แล้วก็จะมี scheduler ที่เอาไว้ควบคุม job schedule และจะเห็นว่ามันกำลัง build worker ซึ่งเป็นตัว run job ฮะ

สุดท้ายจะเป็น webserver เมื่อเราเห็นหน้าตาประมาณนี้ แปลว่า Airflow 2 พร้อมให้บริการแล้วฮะ

2. Login

เข้าเว็บ http://localhost:8080 แล้วกรอก username/password เป็น airflow/airflow

มันควรจะเข้ามาที่หน้านี้ หน้าโล่งๆ ที่เดี๋ยวเราจะใส่ DAG เข้าไปละฮะ

3. วาง DAG

กลับไปที่ editor ของเรา ผมขอใส่ DAG file ตัวอย่างที่ได้มาจาก https://airflow.apache.org/docs/apache-airflow/stable/tutorial/fundamentals.html แล้ว save ไว้ที่ folder /dags

มันจะใช้เวลาสักพักนึง ถึงจะ compile แล้วขึ้นไปแสดงที่หน้า DAG web แต่ถ้าใจร้อน สามารถ trigger ได้จากขั้นตอนง่ายๆ ดังนี้ฮะ

1. เข้าไปที่เครื่อง worker แล้วรันคำสั่ง

docker exec -it <airflow-worker-container-name> /bin/bash

ตรง airflow-worker-container-name เป็นชื่อ container ที่เราสามารถเช็คได้จากคำสั่ง docker ps -a แล้วเลือกชื่อที่มีคำว่า worker

2. สั่งให้มัน list DAG ด้วย

airflow dags list

มันจะ compile DAG ให้อัตโนมัติเลย และถ้าทุก DAG สามารถ compile ได้ถูกต้องเรียบร้อยทั้งหมด เราก็จะเห็น DAG list บน web ทันทีฮะ

4. ให้ DAG เจ๊งดูบ้าง

สมมติว่า DAG ของเราไม่แสดงบน webserver อาจจะมี error อะไรบางอย่าง ซึ่งปกติมันจะแสดง error บน web ให้ แต่เรามีอีกวิธีคือ trigger แล้วสั่งเช็คจาก Terminal ได้แบบนี้ฮะ

airflow dags list-import-errors

คำสั่งนี้จะ compile DAG แล้วแสดงว่าเจอ error ที่ไหนบ้าง ให้เราแก้ได้ง่ายขึ้นฮะ เช่น จากตัวอย่างข้างล่าง ผมแก้จาก dot เป็น comma ทำให้ความหมายเปลี่ยน และ code เสียหาย มันก็จะบอกได้ว่า เสียหายที่ไฟล์ไหน บรรทัดที่เท่าไร

5. ปล่อยให้ DAG ทำงาน

เอาล่ะ ถือว่าตอนนี้ทุกอย่างปกติดี DAG สมบูรณ์ เรากดมาที่ DAG ของเราจะเห็นหน้าตาสะอาดๆ แบบนี้ อ่านง่ายๆ แบบนี้

DAG history ก็ดูเรียบร้อยขึ้น แถมมี basic stats ไว้ข้างๆ สะอาดตาขึ้นนะฮะ

ส่วน DAG Graph ก็ปรับนิดหน่อยละมั้ง ดูเรียบๆ มินิมอลขึ้นนิดนึง

6. docker-compose down

เอาล่ะ เมื่อเราเสร็จงานแล้ว ถ้าต้องการจะ stop container ให้หยุด running tasks จากใน Terminal ก่อน ( control + c ถ้าเป็น Mac) และรันคำสั่ง

# stop all containers
docker-compose down

# stop all containers and remove everything
docker-compose down --volumes --rmi all

ถือว่าเป็นจุดเริ่มต้น ถ้าใครสนใจลองใช้ Airflow 2 บน Docker นะฮะ แต่อย่างไรก็ตาม ไม่แนะนำให้ใช้วิธีนี้กับ Production เนื่องจากขาด feature และ security ที่เป็น Production grade กลับกัน ถ้าใช้ develop pipeline ใน local machine ถือว่าสะดวกมากๆ เลยฮะ

คิดว่า บล็อกนี้จะเป็นประโยชน์สำหรับคนที่จะเริ่มต้นใช้ Airflow 2 ได้พอสมควรนะฮะ